题目原文:
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] ]
题意分析:
与前面的3sum类似,唯一的差别是这次变成了四个数字的组合,解题思路与16_3Sum Closest相似,这次用target减去两个选出的数作为目标。
若加入分支限界等思路可的得到更好的效率。
解题代码:
#include <iostream>
#include <vector>
#include <set>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
//返回所有可能的组合的容器
set<vector<int>> vv_Ret;
vector<vector<int>> Ret;
int nLen = nums.size();
if (nLen<4)
{
return Ret;
}
sort(nums.begin(),nums.end());
for (int a = 0; a<nLen-3;a++)
{
for (int b = a+1; b<nLen-2;b++)
{
int nTempTarget = target-nums[a]-nums[b];
int c = b+1;
int d = nLen-1;
while (c<d)
{
int nNowSum = nTempTarget-nums[c]-nums[d];
if (nNowSum < 0)
{
d--;
continue;
}
else if (nNowSum > 0)
{
c++;
continue;
}
else if (nNowSum == 0)
{
vector<int> vTemp;
vTemp.push_back(nums[a]);
vTemp.push_back(nums[b]);
vTemp.push_back(nums[c]);
vTemp.push_back(nums[d]);
vv_Ret.insert(vTemp);
c++;
}
}
}
}
/* vector<vector<int>>::iterator iter;
iter = unique(vv_Ret.begin(),vv_Ret.end());
if(iter != vv_Ret.end()){
vv_Ret.erase(iter,vv_Ret.end());
}*/
for (set<vector<int>>::iterator ite = vv_Ret.begin(); ite!= vv_Ret.end();ite++)
{
Ret.push_back(*ite);
}
return Ret;
}
};