# leetcode 018 —— 4Sum （nsum）

Given an array S of n integers, are there elements abc, 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)

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;
}
}
};

#### LeetCode 018 4Sum

2014-02-13 22:55:41

#### leetcode 018 4sum (Python)

2015-06-11 22:22:11

#### Leetcode 018 4Sum （Twopoint）

2018-06-07 02:49:28

#### LeetCode 018 4sum

2015-12-17 21:26:05

#### leetcode 018 ----------------4sum 解题报告

2018-01-21 18:08:35

#### 018 - 4Sum

2015-11-11 17:28:21

#### [C++]LeetCode: 71 4Sum && kSum总结

2015-01-06 10:43:37

#### Leetcode: 4Sum

2013-10-08 12:51:59

#### 4Sum -- LeetCode

2014-05-01 04:13:26

#### LeetCode 之 4Sum 的四种实现

2015-08-24 13:15:33