3SumJan 18 '12 6170 / 23359
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)
沿用了3 Sum closest的代码
class Solution { public: void swap(vector<int> &num,int i,int j){ int temp=num[i]; num[i]=num[j]; num[j]=temp; } void bottomUp(vector<int> &num,int end){ while(end>0) { if(num[end]>num[end/2]){ swap(num,end,end/2); end/=2; } else break; } } void topDown(vector<int>&num,int end){ int index=0; while(true){ if(index*2>end){ break; } else if(index*2==end){ if(num[index]<num[index*2]){ swap(num,index,index*2); index*=2; } else break; } else{ int big=num[index]; int bigindex=index; if(num[index*2]>big){ big=num[index*2]; bigindex=index*2; } if(num[index*2+1]>big){ bigindex=index*2+1; } if(bigindex==index)break; else{ swap(num,index,bigindex); index=bigindex; } } } } void sort(vector<int>&num){ for(int i=0;i<num.size();i++){ bottomUp(num,i); } for(int i=num.size()-1;i>0;i--){ swap(num,0,i); topDown(num,i-1); } } int getIndexNearestSmall(vector<int>&num,int start,int end,int target){ if(start==end)return start; int mid=(start+end)/2; if(num[mid]>target) return getIndexNearestSmall(num,start,mid,target); else if(num[mid]==target) return mid; else return getIndexNearestSmall(num,mid+1,end,target); } int getIndexNearestSmall(vector<int>&num,int start,int target){ if(num[start]>target)return start; if(num[num.size()-1]<target)return num.size()-1; else return getIndexNearestSmall(num,start,num.size()-1,target); } vector<vector<int> > threeSum(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int>> result; if(num.size()<3)return result; int target=0; sort(num); int sum=0; int best=0; for(int i=0;i<num.size()-2;i++){ for(int j=i+1;j<num.size()-1;j++){ //cout<<i<<" "<<j<<endl; int k=getIndexNearestSmall(num,j+1,target-num[i]-num[j]); sum=num[i]+num[j]+num[k]; if(sum==target){ vector<int> ret; ret.push_back(num[i]); ret.push_back(num[j]); ret.push_back(num[k]); bool flag=true; for(int ii=0;ii<result.size();ii++){ if(result[ii][0]==ret[0]&&result[ii][1]==ret[1]&&result[ii][2]==ret[2]) {flag=false;break;} } if(flag) result.push_back(ret); } } } return result; } };