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)
思路:可以上升到Nsum的问题,在3sum的基础上再加一个循环,或者,当为nsum时,采用递归实现。
4sum就不玩了,直接上nSum
class Solution {
public:
vector<vector<int>> nSum(vector<int>& nums, int target,int n) {
vector<vector<int>> res;
vector<int> path;
sort(nums.begin(), nums.end());
scan(n, 0, target, path,nums, res);
return res;
}
void scan(int level, int start, int target, vector<int> path, vector<int>& nums,
vector<vector<int>> &res)
{
if (level > 2){ //level表示在start与n-1之间删选level个元素
for (int i = start; i < nums.size()-level+1; i++){
if (i>0 && nums[i] == nums[i - 1])
continue;
path.push_back(nums[i]);
scan(level - 1, i+1 , target - nums[i],path,nums,res);
path.pop_back();
}
}
if (level == 2){
int l = start;
int r = nums.size() - 1;
while (l < r){
int sum = nums[l] + nums[r];
if (sum == target){
//path.push_back(nums[start-1]);
path.push_back(nums[l]);
path.push_back(nums[r]);
res.push_back(path);
//path.pop_back();
path.pop_back();
path.pop_back();
while (l < r&&nums[l] == nums[l + 1])
l++;
while (l < r&&nums[r] == nums[r - 1])
r--;
l++;
r--;
}
else if (sum > target)
r--;
else
l++;
}
return;
}
}
};