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] ]解法:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
class Solution
{
public:
vector<vector<int> > fourSum(vector<int>& nums, int target)
{
int numsSize=nums.size();
sort(nums.begin(),nums.end());
vector<vector<int> >results;
for(int i=0;i<numsSize-3;i++)
{
if(num[i]>target&&nums[i]>=0) break;
if(i>0&&nums[i-1]==nums[i]) continue;
for(int j=i+1;j<numsSize-2;j++)
{
if(num[j]+nums[i]>target&&nums[j]>=0) break;
if(j>i+1&&nums[j]==nums[j-1]) continue;
int k=j+1;
int l=numsSize-1;
while(k<l)
{
if(k>j+1&&nums[k]==nums[k-1])
{
k++;
continue;
}
if(l<numsSize-1&&nums[l]==nums[l+1])
{
l--;
continue;
}
int sum=nums[i]+nums[j]+nums[k]+nums[l];
if(sum>target)
{
l--;
continue;
}
if(sum<target)
{
k++;
continue;
}
vector<int> result;
result.push_back(nums[i]);result.push_back(nums[j]);
result.push_back(nums[k]);result.push_back(nums[l]);
results.push_back(result);
k++;
//cout<<"A result is "<<nums[i]<<" "<<nums[j]<<" "<<nums[k]<<" "<<nums[l]<<endl;
}
}
}
return results;
}
};
int main()
{
// Solution solution;
// vector<int>nums;
// nums.push_back(1);
// nums.push_back(0);
// nums.push_back(-1);
// nums.push_back(0);
// nums.push_back(-2);
// nums.push_back(2);
// vector<vector<int> > results;
// results=solution.fourSum(nums,0);
// for(int i=0;i<results.size();i++)
// {
// vector<int>result=results[i];
// printf("%d %d %d %d\n",result[0],result[1],result[2],result[3]);
// }
Solution solution;
vector<int>nums;
nums.push_back(0);
nums.push_back(0);
nums.push_back(0);
nums.push_back(0);
vector<vector<int> > results;
results=solution.fourSum(nums,0);
for(int i=0;i<results.size();i++)
{
vector<int>result=results[i];
printf("%d %d %d %d\n",result[0],result[1],result[2],result[3]);
}
}