难度:3
3Sum的题意:
给出一列数,找出所有的满足条件的三个数,条件:三个数相加等于0
3Sum Closest 的题意:
给出一列数,找出三个数使得三个数相加最接近target
4Sum:
和3sum一样,不过是4个数
解法:
都一样。。基本改几行就能过另外两个题
3Sum的解法:
按从小到大排序
假设找到的三个数a,b,c满足
a+b+c=0
a<=b<=c
从左往右枚举a,在[a+1,n]中寻找b和c使得b+c==-a
初始令b=a+1,c=n
当b+c<-a时,为增大b+c,应使得b右移
当b+c>-a时,为减小b+c,应使得c左移
当b+c=a时,记录结果
O(n^2)
3Sum
class Solution
{
public:
vector< vector<int> > threeSum(vector<int> &num)
{
vector< vector<int> > ans;
sort(num.begin(),num.end());
for(int i=0;i<num.size();i++)
{
if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含
{
continue;
}
//j,k,num[j]+num[k]=-num[i]
int j=i+1;
int k=num.size()-1;
while(j<num.size()&&k>i&&j<k)
{
if(num[j]+num[k]>-num[i]) k--;
else if(num[j]+num[k]<-num[i]) j++;
else
{
vector<int>tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
if(ans.size()>=1&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k])
{
j++;
continue;
}
ans.push_back(tmp);
j++;
}
}
}
return ans;
}
};
3Sum Closest
class Solution
{
public:
int threeSumClosest(vector<int> &num, int target)
{
int ans=0x3fffffff;
sort(num.begin(),num.end());
for(int i=0;i<num.size();i++)
{
if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含
{
continue;
}
//j,k,num[i]+num[j]+num[k]=target
int j=i+1;
int k=num.size()-1;
while(j<num.size()&&k>i&&j<k)
{
if(num[i]+num[j]+num[k]>target)
{
if(num[i]+num[j]+num[k]-target<abs(ans-target))
{
ans=num[i]+num[j]+num[k];
}
k--;
}
else if(num[i]+num[j]+num[k]<target)
{
if(target-num[i]-num[j]-num[k]<abs(ans-target))
{
ans=num[i]+num[j]+num[k];
}
j++;
}
else
{
return target;
}
}
}
return ans;
}
};
4Sum
class Solution
{
public:
vector<vector<int> > fourSum(vector<int> &num, int target)
{
sort(num.begin(),num.end());
vector<vector<int> > ans;
for(int i=0;i<num.size();i++)
{
if(i>=1&&num[i] == num[i-1])
{
continue;
}
for(int j=i+1;j<num.size();j++)
{
if(j-1>=i+1&&num[j] == num[j-1])
{
continue;
}
int k=j+1;
int l=num.size()-1;
while(k<l&&k<num.size())
{
if(num[i]+num[j]+num[k]+num[l] > target) l--;
else if(num[i]+num[j]+num[k]+num[l] < target) k++;
else
{
if(ans.size()>0&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k]&&ans[ans.size()-1][3] == num[l])
{
k++;
continue;
}
vector<int>tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
tmp.push_back(num[l]);
ans.push_back(tmp);
k++;
}
}
}
}
return ans;
}
};