3 sum
a+b+c=0
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> >v; vector<int>v1; sort(num.begin(),num.end()); for(int i=0;i<num.size();i++) { if(num.size()<3)break; if(num[i]>0)break; for(int a=i+1,b=num.size()-1;a<b;) { int sum=num[i]+num[a]+num[b]; if(sum==0) { v1.clear(); v1.push_back(num[i]); v1.push_back(num[a]); v1.push_back(num[b]); if(count(v.begin(),v.end(),v1)==0) v.push_back(v1); a++;b--; } if(sum<0) { a++; } if(sum>0){b--;} } } return v; } };
3 sum closet
class Solution { public: int threeSumClosest(vector<int> &num, int target) { int n=num.size(); assert(n>=3); sort(num.begin(),num.end()); int value; int sum=num[0]+num[1]+num[2]; int diff=abs(sum-target); int temp=sum; for(int i=0;i<n-2;i++) { int a=i; int b=n-1; int m; value = target-num[a]-num[b]; while(a<b) { m=a+(b-a)/2; if(value==num[m])return target; if(abs(num[m]-value)<diff) { diff=abs(num[m]-value); temp=target-value+num[m]; } if(num[m]>value) { b=m-1; } else { a=m+1; } } } return temp; } };
以上代码有问题,二分查找此处中间值不能等于边界值。
class Solution { public: int threeSumClosest(vector<int> &num, int target) { int n=num.size(); assert(n>=3); sort(num.begin(),num.end()); int value; int sum=num[0]+num[1]+num[2]; int diff=abs(sum-target); int temp=sum; int i=0,j=n-1; while(i<n-2&&j>1&&i<j-1) { int a=i; int b=j; int m; value = target-num[a]-num[b]; while(a<b-1) { m=a+(b-a)/2; if(value==num[m])return target; if(abs(num[m]-value)<diff) { diff=abs(num[m]-value); temp=target-value+num[m]; } if(num[m]>value) { b=m; } else { a=m; } } if(value<0)j--; else if(value>0) i++; else if(value==0&&num[m]>0)j--; else i++; } return temp; } };
4 sum
定义一对指针,指向两头。再定义一对指针,指向中间的两个元素。加起来看看跟target比较一下。再决定内部指针怎么移动
class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<int>v; vector<vector<int>>v1; int len=num.size(); if(len<=3)return v1; sort(num.begin(),num.end()); for(int i=0;i<len-3;i++) { for(int k=len-1;k>i+2;k--) { int ab=num[i]+num[k]; int c=target-ab; int m=i+1,n=k-1; for(;m<n;) { int sum=num[m]+num[n]; if(sum==c) { v.clear(); v.push_back(num[i]); v.push_back(num[m]); v.push_back(num[n]); v.push_back(num[k]); if(count(v1.begin(),v1.end(),v)==0) v1.push_back(v); m++;n--; } else if(sum<c) { m++; } else n--; } } } return v1; } };