题目:
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: 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]
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
算法思想:
与3Sum相似,只不过在3Sum基础上增加一层循环,可参考3Sum实现
C++代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<vector<int> > fourSum(vector<int>& nums, int target) {
vector<vector<int> > result;
sort(nums.begin(),nums.end());
for(int m=0;m<nums.size();m++){
if(m>0&&nums[m]==nums[m-1])
continue;
for(int i=m+1;i<nums.size();i++){
if(i>m+1&&nums[i]==nums[i-1])
continue;
int twoSumTarget=target-nums[i]-nums[m];
int j=i+1;
int k=nums.size()-1;
while(j<k){
if(nums[j]+nums[k]==twoSumTarget){
vector<int> temp;
temp.push_back(nums[m]);
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
result.push_back(temp);
while (j < k && nums[j] == nums[j + 1]) ++j;//重复元素跳过
while (i < k && nums[k] == nums[k - 1]) --k;
k--;
j++;
}else if(nums[j]+nums[k]>twoSumTarget){//两数之和大于目标值,则尾指针向前移动
k--;
}else{
j++;
}
}
}
}
return result;
}
};
int main(){
vector<vector<int> > result;
int d[6]={1, 0, -1, 0, -2, 2};
vector<int> data;
for(int i=0;i<6;i++){
data.push_back(d[i]);
}
Solution sol;
result=sol.fourSum(data,0);
for(int i=0;i<result.size();i++){
for(int j=0;j<result[i].size();j++){
cout<<result[i][j]<<" ";
}
cout<<endl;
}
}