leetcode No.15-16 三数之和相关问题

leetcode 15. 三数之和

题目

链接:https://leetcode-cn.com/problems/3sum

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

C++代码

首先最直接的解法显然是暴力循环,将所有可能的情况都遍历一遍。

这样所需要嵌套三个for循环,因此时间复杂度O(N3),显然无法接受。

如何优化呢?我没有思路,考虑先将问题简化。

可以对给定数组进行排序,变为有序数组,而排序的时间复杂度时O(NlogN),在暴力法面前不值一提,因此这个思路可行。

当数组有序时,我们就有办法处理了。问题变为了:

固定三元组中的最小数,找到 b + c = -a

既然是有序数组,我们就可以用双指针法,不断缩小可取值的范围,直到左指针l<右指针r的条件不满足

另外,需要思考下如何处理满足条件的三元组不唯一的情况,以及如何去重。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int target;vector<vector<int>> ans;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++) {if (i > 0 && nums[i] == nums[i - 1]) continue;if ((target = nums[i]) > 0) break;int l = i + 1, r = nums.size() - 1;while (l < r) {if (nums[l] + nums[r] + target < 0) ++l;else if (nums[l] + nums[r] + target > 0) --r;else {ans.push_back({target, nums[l], nums[r]});++l, --r;while (l < r && nums[l] == nums[l - 1]) ++l;while (l < r && nums[r] == nums[r + 1]) --r;}}}return ans; }
};

leetcode 16. 最接近的三数之和

题目

链接:https://leetcode-cn.com/problems/3sum-closest/

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

C++代码

依旧延续leetcode NO.15 三数之和的方案,没有思路,先将问题简化,对数组nums进行排序,转为有序数组。

此时,我们依然可以使用双指针法来求解本问题。

注意思考:如何证明双指针法在逐渐收缩的过程中不会错过最优解?

class Solution {
public:int threeSumClosest(vector<int>& nums, int target) {int total_best_sum = -1;int total_min_dict = INT_MAX;if(nums.size() < 3)return total_best_sum;// 首先对数组进行排序sort(nums.begin(), nums.end());for(int i = 0; i < nums.size() - 2; i++){int a = nums[i];int residual = target - a;int l = i + 1;int r = nums.size() - 1;int min_dict = INT_MAX;int best_sum = -1;while(l < r){int cur_threeSum = a + nums[l] + nums[r];int cur_dict = abs(target - cur_threeSum);if(cur_dict == 0)return target;if(cur_dict < min_dict){min_dict = cur_dict;best_sum = cur_threeSum;}if(target - cur_threeSum > 0)l++;elser--;}// 结束了a = nums[i]时最优三元组的寻找,判断是否为总体最优if(min_dict < total_min_dict){total_min_dict = min_dict;total_best_sum = best_sum;}}return total_best_sum;}
};

执行用时: 4 ms, 在所有 C++ 提交中击败了 99.46% 的用户

内存消耗: 12.2 MB, 在所有 C++ 提交中击败了 5.14% 的用户

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法&#xff0c;基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制&#xff0c;智能PID控制不同于常规意义下的智能控制&#xff0c;是智能算法与PID控制算法的结合&#xff0c…

leetcode No.123 买卖股票的最佳时机 III

题目 链接&#xff1a;https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多…

Modbus协议栈开发笔记之七:Modbus ASCII Slave开发

与Modbus RTU在串行链路上分为Slave和Master一样&#xff0c;Modbus ASCII也分为Slave和Master&#xff0c;这一节我们就来开发Slave。对于Modbus ASCII从站来说&#xff0c;需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令&a…

leetcode No.21 合并两个有序链表

题目 链接&#xff1a;https://leetcode-cn.com/problems/merge-two-sorted-lists 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1-&…

Modbus协议栈开发笔记之八:Modbus ASCII Master开发

这一节我们来封装Modbus ASCII Master应用&#xff0c;Modbus ASCII主站的开发与RTU主站的开发是一致的。同样的我们也不是做具体的应用&#xff0c;而是实现ASCII主站的基本功能。我们将ASCII主站的功能封装为函数&#xff0c;以便在开发具体应用时调用。 对于ASCII主站我们主…

leetcode No.83 删除排序链表中的重复元素

题目 链接&#xff1a;https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 给定一个排序链表&#xff0c;删除所有重复的元素&#xff0c;使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&…

在Eclipse中使用Git

本文原文出自MCU on Eclipse网站&#xff0c;作者为Erich Styger&#xff0c;原文网址&#xff1a;https://mcuoneclipse.com/2018/09/30/tutorial-git-with-eclipse/。本人翻译了此篇文章&#xff0c;有些短语难以找到准确表达的中文词语&#xff0c;所以保持了原文。限于个人…

leetcode No.141 环形链表

题目 链接&#xff1a;https://leetcode-cn.com/problems/linked-list-cycle 给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&…

C语言学习及应用笔记之三:C语言const关键字及其使用

在C语言程序中&#xff0c;const关键字也是经常会用到的一个关键字&#xff0c;那么使用const关键字的目的是什么呢&#xff1f;事实上&#xff0c;在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。 事实上&#xff0c;无论我们是使用const关键字声明…

leetcode No.2 两数相加

题目 链接&#xff1a;https://leetcode-cn.com/problems/add-two-numbers 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加…

nlp cs224n 学习笔记1 Introduction and Word Vectors

注&#xff1a;个人笔记&#xff0c;价值有限&#xff0c;不建议逗留。 word embedding 的意义和目的&#xff1f; 通过一种映射&#xff0c;将自然语言中的单词&#xff0c;嵌入到n维欧式空间中&#xff0c;得到可以用数学语言表达并用计算机计算的“词向量”。 同时我们希望…

Modbus协议栈开发笔记之一:实现功能的基本设计

Modbus作为开放式的工业通讯协议&#xff0c;在各种工业设备中应用极其广泛。本人也使用Modbus通讯很多年了&#xff0c;或者用现成的&#xff0c;或者针对具体应用开发&#xff0c;一直以来都想要开发一个比较通用的协议栈能在后续的项目中复用&#xff0c;而不必每次都写一遍…

天池CV学习赛:街景字符识别-思路与上分技巧汇总

Datawhale 和 天池 合作的零基础入门CV - 街景字符编码识别比赛的正式赛已经结束。本文对一些比赛思路和上分技巧进行了汇总和整理&#xff0c;希望对大家深入学习CV能够有帮助。 本文分为以下几部分&#xff1a; 如何优化官方baseline的效果&#xff1f; 其它解题思路的整理…

Modbus协议栈开发笔记之二:Modbus消息帧的生成

前面我们已经对Modbus的基本事务作了说明&#xff0c;也据此设计了我们将要实现的主从站的操作流程。这其中与Modbus直接相关的就是Modbus消息帧的生成。Modbus消息帧也是实现Modbus通讯协议的根本。 1、Modbus消息帧分析 MODBUS协议在不同的物理链路上的消息帧有一些差异&am…

动手学CV-目标检测入门教程:基本概念

3.1 目标检测基本概念 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使…

动手学CV-目标检测入门教程2:VOC数据集

3.2 目标检测数据集VOC 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果…

C语言学习及应用笔记之四:C语言volatile关键字及其使用

在C语言中&#xff0c;还有一个并不经常使用但却非常有用的关键字volatile。那么使用volatile关键字究竟能干什么呢&#xff1f;接下来我将就此问题进行讨论。 一个使用volatile关键字定义变量&#xff0c;其实就是告诉编译系统这变量可能会被意想不到地改变。那么编译时&…

Modbus协议栈开发笔记之三:Modbus TCP Server开发

在完成了前面的工作后&#xff0c;我们就可以实现有针对性的应用了&#xff0c;首先我们来实现Modbus TCP的服务器端应用。当然我们不是做具体的应用&#xff0c;而是对Modbus TCP的服务器端应用进行封装以供有需要时调用。 这里我们不涉及TCP的协议&#xff0c;这部分与Modbu…

动手学CV-目标检测入门教程3:锚框(anchor)

3.3 锚框 or 先验框 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使…

动手学CV-目标检测入门教程4:模型结构

3.4 模型结构 本文来自开源组织 DataWhale &#x1f433; CV小组创作的目标检测入门教程。 对应开源项目 《动手学CV-Pytorch》 的第3章的内容&#xff0c;教程中涉及的代码也可以在项目中找到&#xff0c;后续会持续更新更多的优质内容&#xff0c;欢迎⭐️。 如果使用我们…