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: 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]
]
跟2Sum 3Sum类似,用两个指针left , right 在后面遍历一遍,复杂度 O(n^3)
55ms Ac
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
vector<vector<int> > res;
vector<int> tmp;
sort(nums.begin(),nums.end());
int len = nums.size();
for(int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
int left = j+1, right = len-1;
while(left < right)
{
int sum = nums[i]+nums[j]+nums[left]+nums[right];
if(sum == target)//找到目标
{
tmp.push_back(nums[i]); tmp.push_back(nums[j]);
tmp.push_back(nums[left]); tmp.push_back(nums[right]);
res.push_back(tmp);
while(left<len-1 && nums[left]==tmp[2])//不这样比较容易陷入死循环:因为left/right可能会没有移动
{
left++;
}
while(right>=1 && nums[right]==tmp[3])
{
right--;
}
tmp.clear();
}
else if(sum < target)
{
left++;
}
else
{
right--;
}
while(j+1<len && nums[j]==nums[j+1])
{
j++;
}
}
}
while(i+1<len && nums[i]==nums[i+1])
{
i++;
}
}
return res;
}
};