# leecode_18 4Sum (k Sum)

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)

( {0}, 2 )    ( { 0,0 }, 2)  ( {0,0,0}, 2 )

#include <iostream>
#include <string>
#include <unordered_map>
#include <queue>
#include <unordered_set>
using namespace std;

vector<vector<int>> fourSum(vector<int>& nums, int target) {
int k=4;
vector<vector<int>> res;
queue< pair< vector<int>,int > > que;
sort(nums.begin(),nums.end());
//ini
for (int i=0;i<nums.size();i++){
int low_bound=lower_bound(nums.begin(), nums.end(),nums[i])-nums.begin();
int up_bound=upper_bound(nums.begin(),nums.end(),nums[i])-nums.begin();
vector<int> temp;
for (int i=low_bound;i<up_bound;i++){
temp.push_back(nums[i]);
que.push(make_pair(temp,up_bound-1));
}
i=up_bound-1;
}

while(!que.empty()){
vector<int> vec=que.front().first;
int index=que.front().second;
que.pop();
//cout<<endl;
int sum=0;
for (int i=0;i<vec.size();i++)
sum+=vec[i];
if (vec.size()==k && sum==target){
res.push_back(vec);
continue;
}

if (vec.size()==k-1 && index<=nums.size()-2)
for (int i=index+1;i<nums.size();i++){
if (sum+nums[i]==target){
vec.push_back(nums[i]);
res.push_back(vec);
break;
}
continue;
}

if (vec.size()<k-1 && index<=nums.size()-2){
int temp=sum;
vector<int> v_temp=vec;
for (int i=index+1;i<nums.size();i++){
int p=nums[i];
int low_bound=lower_bound(nums.begin(), nums.end(),p)-nums.begin();
int up_bound=upper_bound(nums.begin(),nums.end(),p)-nums.begin();

for (int i=low_bound;i<up_bound;i++){
sum+=nums[i];
vec.push_back(nums[i]);
if (vec.size()<=k){
//                        for (int j=0;j<vec.size();j++)
//                            cout<<vec[j]<<" ";
//                        cout<<endl;
que.push(make_pair(vec,up_bound-1));
}

}
vec=v_temp;
sum=temp;
i=up_bound-1;
}
}

}

return res;
}

int main(){
vector<int> vec1={1,0, -1, 0, -2, 2};

vector<vector<int>> res=fourSum(vec1,0);

for (int i=0;i<res.size();i++){
for(int j=0;j<res[i].size();j++)
cout<<res[i][j]<<" ";
cout<<endl;
}

return 0;

}

• 本文已收录于以下专栏：

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

• cinderella_niu
• 2015年01月06日 10:43
• 1679

## [leetcode] 求和问题总结(2Sum, 3Sum, 4Sum, K Sum)

• bhwolf1987
• 2013年11月03日 14:07
• 8972

## 4Sum -- LeetCode

• linhuanmars
• 2014年05月01日 04:13
• 21012

## 【算法】2SUM/3SUM/4SUM问题

• haolexiao
• 2017年04月26日 01:21
• 2347

## 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)

• doc_sgl
• 2013年10月09日 00:15
• 18197

## [LeetCode] K sum(2Sum、3Sum、4Sum)

2Sum & 3Sum & 4Sum & KSum
• ILOVEYOUXIAOWANGZI
• 2014年05月13日 15:34
• 1552

## Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先，这是一道远古之前的题的进化版： Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了，因为我也记不住了。。这道题意思就是ABCD四个数组，长...
• MebiuW
• 2016年11月16日 22:45
• 2938

## 560. Subarray Sum Equals K leetcode

• meizum9zjl
• 2017年05月11日 22:46
• 325

## leetcode: 2Sum/3Sum/3SumClosest/4Sum系列问题

leetcode（http://leetcode.com/onlinejudge）上有好几道关于数组中几个数据和为target的题目。恰好正在看剑指offer中“和为s的两个数组这章”，据此思想，le...
• li4951
• 2013年03月19日 19:49
• 9725

## [leetcode] 560. Subarray Sum Equals K

Given an array of integers and an integer k, you need to find the total number of continuous subarra...
• TstsUgeg
• 2017年05月03日 10:34
• 1907

举报原因： 您举报文章：leecode_18 4Sum (k Sum) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)