Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
pro:给一个数组,和一个target,求出数组中所有和等于target的元组,不能有重复的。
sol:仍旧采用了2sum的思想,不知道有没有其他好的方法。
1.对数组排序
2.用i,j枚举数组中的两个元素(一般我们说枚举就是指比如j从i+1开始),然后m和n分别从j+1和len-1开始
code:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
int i,j,m,n,len;
len = num.size();
vector< vector<int> > res;
res.clear();
if(len<4) return res;
sort(num.begin(),num.end());
vector<int> temp;
for(i=0;i<len-3;i++)
{
if(i!=0&&num[i]==num[i-1]) continue;
for(j=i+1;j<len-2;j++)
{
if(j!=i+1&&num[j]==num[j-1]) continue;
temp.clear();
temp.push_back(num[i]);
temp.push_back(num[j]);
m=j+1,n=len-1;
while(m<n)
{
if(num[i]+num[j]+num[m]+num[n]==target)
{
temp.push_back(num[m]);
temp.push_back(num[n]);
res.push_back(temp);
temp.pop_back();
temp.pop_back();
m++;
while(m<n&&num[m]==num[m-1]) m++;
n--;
while(m<n&&num[n]==num[n+1]) n--;
}else if(num[i]+num[j]+num[m]+num[n]>target)
{
n--;
while(m<n&&num[n]==num[n+1]) n--;
}else
{
m++;
while(m<n&&num[m]==num[m-1]) m++;
}
}
}
}
return res;
}
};