[leetcode] 3Sum

本文详细解析了如何寻找数组中三个整数相加等于零的所有唯一组合。通过排序数组并使用双指针技巧,避免重复计算,实现高效求解。
Given an array  S  of  n  integers, are there elements  a b c  in  S  such that  a  +  b  +  c  = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

思路: 1.将数组排序,

          2.a 遍历 数组a[0]....a[n-1];         

          3.当 a=a[i]  时   后面的问题 就是 :  a[i+1] 到 a[n-1]中  b+c =-a  (编程之美 2.12 快速寻找满足条件的两个数  )      

                       记 b=a[j]=a[i-1]     c=a[k]=a[n-1]   

   若 b+c  < -a ,j++; 

b+c > -a  ,j--;    

b+c=-a 记录下来,并j++;

  4.还有一个问题 就是unique triplet,   所以 a=a[i] 要判断是否和a[i-1]相等,若相等,子问题已经解答。

                                                                              也要判断 b和c  是否和之前的相同,若相同,就已经判断过了。


       罗嗦这么多,直接上代码:

[cpp]  view plain copy
  1. class Solution {  
  2. public:  
  3.     vector<vector<int> > threeSum(vector<int> &num) {  
  4.         // Start typing your C/C++ solution below  
  5.         // DO NOT write int main() function  
  6.          
  7.         vector<vector<int> > ret;  
  8.          ret.clear();  
  9.         sort(num.begin(),num.end());  
  10.         for(int i=0; i!=num.size();i++){  
  11.             if(i > 0 && num[i]==num[i-1])  
  12.                 continue;  
  13.             int j,k;  
  14.             j=i+1;  
  15.             k=num.size()-1;  
  16.             while(j<k){  
  17.                 if(j>i+1&&num[j]==num[j-1]){   
  18.                     j++;  
  19.                     continue;  
  20.                 }  
  21.                 if(k<num.size()-1&& num[k]==num[k+1]){  
  22.                     k--;  
  23.                     continue;  
  24.                 }  
  25.                  int sum = num[i] + num[j] + num[k];  
  26.                 if(sum>0){  
  27.                     k--;  
  28.                 }else if(sum<0){  
  29.                     j++;  
  30.                 }else{  
  31.                     vector<int> tmp;  
  32.                     tmp.push_back(num[i]);  
  33.                     tmp.push_back(num[j]);  
  34.                     tmp.push_back(num[k]);  
  35.                     ret.push_back(tmp);  
  36.                     j++;  
  37.                 }  
  38.             }  
  39.         }  
  40.         return ret;  
  41.               
  42.     }  
  43. };  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值