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)
解题思路:
(1)对数组进行递增排序
(2)第一个加数从前到后枚举
(3)第二个加数从前到后枚举
(4)设置两个指针分别指向第三个和第四个加数,第三个加数从前往后移动,第四个加数从后往前移动
(5)加数去重的方法
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int numsSize = nums.size();
//对数组进行递增排序
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < numsSize; i++)
{
//对元素nums[i]去重
while((i > 0) && (nums[i] == nums[i-1]) && (i < numsSize-3))
{
i++;
}
for (int j = i+1; j < numsSize; j++)
{
//对元素nums[j]去重
while ((j > i+1) && (nums[j] == nums[j-1]) && (j < numsSize-2))
{
j++;
}
int k = j+1;
int m = numsSize-1;
while (k < m)
{
int sum = nums[i]+nums[j]+nums[k]+nums[m];
if (sum < target)
{
k++;
while (nums[k] == nums[k-1] && k < m)
{
k++;
}
}
else if (sum > target)
{
m--;
while (nums[m] == nums[m+1] && k < m)
{
m--;
}
}
else
{
vector<int> temp(4);
temp[0] = nums[i];
temp[1] = nums[j];
temp[2] = nums[k++];
temp[3] = nums[m--];
res.push_back(temp);
while (nums[k] == nums[k-1] && k < m)
{
k++;
}
while (nums[m] == nums[m+1] && k < m)
{
m--;
}
}
}
}
}
return res;
}
};