[M]Leetcode15-3sum

分析

1.暴力搜
2.类似两数和的思想
a+b+c=0 ->a=-(b+c)
如果a确定的话就和两数和是一样的思路。
这里采用双指针,从两边往中间搜:


其实这题相比2SUM多了几个难点:

  1. 数组里允许重复的数
  2. 结果要按升序排列
  3. 结果中不能出现重复的结果

a+b+c=0也就是说一定要有一项是负的,为了降低复杂度和最后结果升序,我们现将数组排序,a始终指向负数且是最小的。
b从a后开始搜。
c则从最右往中间搜。

可以想到伪代码:

sort()
for(int a=0;a-a) c往左走
  else 符合条件,存入vector
  }
}

但是!!!
不能是重复的数组,也就是说还需要排除相同的情况!
只要判断a,b,c指向的数是否判断过,判断过的话就跳过即可。

sort()
for(int a=0;a-a) c--
  else
     符合条件,存入vector
    b++ c--
      if(b

代码(C++)

vector > threeSum(vector& nums) {
    
    vector< vector > ret;
    int len=nums.size();
    sort(nums.begin(), nums.end());  
    for(int left=0;left 0) break;
        if(nums[left]==nums[left-1]){
                continue;
            }
        while(midtmp){
                right--;
            }else{
                ret.push_back({nums[left],nums[mid],nums[right]});
                mid++;
                right--;
                //跳过重复的部分
                while(mid

参考资料:https://hk029.gitbooks.io/leetbook/content/%E6%95%B0%E7%BB%84/015.%203Sum/015.%203Sum.html
http://www.cnblogs.com/grandyang/p/4481576.html

你可能感兴趣的:([M]Leetcode15-3sum)