您的位置:首页 > 其它

Leetcode 3 sum && 3 sum closet&& 4 sum

2013-04-13 14:37 387 查看
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
;
if(sum==c)
{
v.clear();
v.push_back(num[i]);
v.push_back(num[m]);
v.push_back(num
);
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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: