问题:
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)
类似问题:
找出序列中求和最接近于target的三个数 3Sum Closest
思路:固定前两个数,寻找剩下两个数可能的值。为了使得四元组不重复,每一个位置的数不可以重复取。
代码:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector<vector<int> > result;
int n = num.size();
sort(num.begin(), num.end());
if(n < 4)
return result;
for(int i=0;i<=n-4;i++) //i = first element
{
if(i>0 && num[i] == num[i-1]) //avoid duplicate
continue;
for(int j=i+1;j<=n-3;j++) // j = second element
{
if(j>i+1 && num[j] == num[j-1]) //avoid duplicate
continue;
// target - num[i] - num[j]
// from j+1 to n-1
int left = j+1; // left = third element
int right = n-1; // right = fourth element
int cur;
int ta = target - num[i] - num[j];
while(left < right)
{
cur = ta - num[left] - num[right];
if(cur == 0)
{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[left]);
tmp.push_back(num[right]);
result.push_back(tmp);
left++;
while(left < right && num[left-1] == num[left]) //avoid duplicate
left++;
right--;
while(left < right && num[right+1] == num[right]) //avoid duplicate
right--;
}
else if(cur > 0)
{
left++;
while(left < right && num[left-1] == num[left]) //avoid duplicate
left++;
}
else
{
right--;
while(left < right && num[right+1] == num[right]) //avoid duplicate
right--;
}
}
}
}
return result;
}
};