三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2]]
思路分析
暴力O(n3) 这样做还不如不做kj
联想两数之和那道题,可以采用map哈希来查找需要的值,但由于要先确定两个数之和,才能知道需要的值,所以有时间O(n2)+空间O(n)。
牺牲O(Nlog N)对数组sort,排序之后找数即可用双指针头尾同步进行
我的做法是,对于a<=b<=c,a+b+c=0,先确定b为
center
,然后对于center的每一次循环中,都让a,c分别从首尾开始,根据sum=a+b+c
与0相比,判断是要a++还是c--。 这里要注意人为考虑特殊情况,注意剪枝,否则像{0,0,0,0,0,0,0,0,0,0,0}会没意义的算很多遍。另外在每个center的内循环中,显然假如最小值大于0,或者最大值小于0,是不可能和为0,可以剪枝。另外,当数组中有重复数字时,会重复进行循环匹配,因此我额外使用了一个
set
。if(sum==0)
之后,额外加一个if(set.count(vector)==0)
来判断是否已经有了相同的组合被存储了,如果没有,则set
和result
同时存储这个新组合,set中存储是为了对之后判重。
解题代码
1 | class Solution |
执行用时 : 424 ms, 在所有 C++ 提交中击败了5.01%的用户 内存消耗 :24.3 MB, 在所有 C++ 提交中击败了7.53%的用户 |
虽然好像剪枝也做了,但好像效率依然不够高,不知道是不是额外加了个set的问题 看别人的题解,不以b以a为外循环可以避免重复,也就不需要set,但没懂是为什么。 挖个坑,搞懂了再回来看看。 |