博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 15. 3Sum
阅读量:5232 次
发布时间:2019-06-14

本文共 2359 字,大约阅读时间需要 7 分钟。

问题链接

题目解析

给定n个元素的数组,寻找符合 \(a+b+c=0\) 的所有 {a, b, c}。

解题思路

如果对LeetCode的第一题 还有印象的话,会发现这道题很类似,不过题目要求的结果有明显区别,本题需要求出所有符合条件的结果。

如果想复用Two Sum中的方法,可以加以转化:\(a+b = -c\),与 \(x+y = target\)就很类似了。存在一个严重的问题——重复的结果!为了避免重复,可以想到需用使用 \(set\) 容器。由于 \(set\) 中的元素是三元素向量,想要避免重复必须使向量中三个元素有序,所以需要先将数组排序。

参考代码

class Solution {public:    vector
> threeSum(vector
& nums) { set
> res; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { if (nums[k] > 0) break; int target = 0 - nums[k];//固定最小数 int i = k + 1, j = nums.size() - 1; while (i < j) { if (nums[i] + nums[j] < target) ++i; else if (nums[i] + nums[j] > target) --j; else { res.insert({nums[k], nums[i], nums[j]}); ++i; --j; } } } return vector
>(res.begin(), res.end()); }};

方法改进

上述代码需要300+ms,太慢了,仔细想想,其实不用 \(set\) 容器也可以做到,先将数组排序,遍历每个数字,即先确定最小的数字,寻找另外两个数,避免重复只需要跳过相等的数字(位于相邻位置)即可。思路一模一样,这其实是对上一方法的简化,因为二者都需要排序,而排好序后相等的数字必然在相邻位置,开直接排序,不需要 \(set\)。这种改进方法只要100+ms,快了不止一点点~

参考代码

class Solution {public:    vector
> threeSum(vector
& nums) { vector
> res; sort(nums.begin(), nums.end()); for (int k = 0; k < nums.size(); k++) { if (nums[k] > 0) break; if (k > 0 && nums[k] == nums[k - 1])//避免重复 continue; int target = 0 - nums[k];//固定最小数 int i = k + 1, j = nums.size() - 1; while (i < j) { if (nums[i] + nums[j] < target) ++i; else if (nums[i] + nums[j] > target) --j; else { res.push_back({nums[k], nums[i], nums[j]}); while (i < j && nums[i] == nums[i + 1])//避免重复 ++i; while (i < j && nums[j] == nums[j - 1])//避免重复 --j; ++i; --j; } } } return res; }};

相似题目


本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


转载于:https://www.cnblogs.com/AlvinZH/p/8602442.html

你可能感兴趣的文章
select 的选中问题
查看>>
java Pattern类
查看>>
基本算法-0/1背包问题
查看>>
广商14级软件工程团队第二次冲刺相关问题
查看>>
测试经理/组长职责
查看>>
cocos2d-x中描述精灵帧图片的plist和json文件各个key的含义
查看>>
Java垃圾回收机制
查看>>
排球比赛规则
查看>>
远程WebService方法
查看>>
【转】HashMap 和 HashTable 到底哪不同 ?
查看>>
软件工程课程-课程作业安排
查看>>
第三次作业
查看>>
loadxml Data at the root level is invalid. Line 1, position 1.
查看>>
springMVC-自定义数据类型转换器
查看>>
使用 VS2015 编译并调试 ffmpeg
查看>>
正则匹配原理之——逆序环视深入
查看>>
统计数字
查看>>
Eclipse build时间太长,无法忍受,完美解决方案,Eclipse 编译太卡,耗时太长
查看>>
solr整合spring
查看>>
linux基础命令
查看>>