题目描述:
Given an array S of n integers, are there elements a,b,c, andd inS 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] ]
这道题和3Sum类似,固定两个数,然后用两个指针进行扫描,时间复杂度为O(n^3)。为避免重复,可以使用集合而不用进行多次判断,使指针跳过重复的元素。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
set<vector<int> > result_set;
vector<vector<int> > result_vec;
if(nums.size()<4) return result_vec;
for(int i=0;i<(nums.size()-3);i++)
{
for(int j=i+1;j<(nums.size()-2);j++)
{
int k=j+1;
int l=nums.size()-1;
while(k<l)
{
int sum=nums[i]+nums[j]+nums[k]+nums[l];
if(sum<target) k++;
else if(sum>target) l--;
else if(sum==target)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
temp.push_back(nums[l]);
result_set.insert(temp);
k++;
l--;
}
}
}
}
for(set<vector<int> >::iterator it=result_set.begin();it!=result_set.end();it++)
result_vec.push_back(*it);
return result_vec;
}
};
避免重复还可以通过对重复数值的判断和指针的移动来完成,但是比集合的方法麻烦一些,对于i、j、k、l的取值需要控制好边界:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<vector<int> > result;
if(nums.size()<4) return result;
for(int i=0;i<(nums.size()-3);i++)
{
while(i>0&&i<(nums.size()-3)&&nums[i]==nums[i-1]) i++;
for(int j=i+1;j<(nums.size()-2);j++)
{
while(j>(i+1)&&j<(nums.size()-2)&&nums[j]==nums[j-1]) j++;
int k=j+1;
int l=nums.size()-1;
while(k<l)
{
int sum=nums[i]+nums[j]+nums[k]+nums[l];
if(sum<target) k++;
else if(sum>target) l--;
else if(sum==target)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
temp.push_back(nums[l]);
result.push_back(temp);
k++;
l--;
while(k<l&&nums[k]==nums[k-1]) k++;
while(k<l&&nums[l]==nums[l+1]) l--;
}
}
}
}
return result;
}
};