# leetcode 018 —— 4Sum （nsum）

92人阅读 评论(0)

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

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：28899次
• 积分：2078
• 等级：
• 排名：第19046名
• 原创：188篇
• 转载：0篇
• 译文：0篇
• 评论：1条
阅读排行
评论排行
最新评论