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:
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)
算法思想: 类似3Sum,先排序,这后两重for循环,然后对最后的一个数组设两个指针遍历。这里注意重复的问题,例如第一重如果和前面一个数相同则跳过,因为前面的查找肯定包含了本次的情况。
C++代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<int> nums_copy = nums;
vector<vector<int>> res;
int sz = nums_copy.size();
sort(nums_copy.begin(),nums_copy.end());
for (int i=0;i<sz;++i)
{
//如果跟上一个讨论过的值重复
if (i>0 && nums_copy[i] == nums_copy[i-1])
{
continue;
}
for (int j=i+1;j<sz;++j)
{
if (j>i+1 && nums_copy[j] == nums_copy[j-1])
{
continue;
}
int s = j+1;
int e = sz - 1;
while(s < e)
{
int sum = nums_copy[i] + nums_copy[j] + nums_copy[s] + nums_copy[e];
if (sum < target)
{
++s;
while(s<e && nums_copy[s] == nums_copy[s-1])
{
++s;
}
}
else if (sum > target)
{
--e;
while(s<e && nums_copy[e] == nums_copy[e+1])
{
--e;
}
}
//sum == target
else
{
//找到一组满足的数
vector<int> tmp;
tmp.push_back(nums_copy[i]);
tmp.push_back(nums_copy[j]);
tmp.push_back(nums_copy[s]);
tmp.push_back(nums_copy[e]);
res.push_back(tmp);
--e;
while(s<e && nums_copy[e] == nums_copy[e+1])
{
--e;
}
++s;
while(s<e && nums_copy[s] == nums_copy[s-1])
{
++s;
}
}
}
}
}
return res;
}
};
int main()
{
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);
Solution s;
vector<vector<int>> res = s.fourSum(nums, 0);
for (vector<vector<int>>::const_iterator ita = res.begin();ita != res.end();++ita)
{
for (vector<int>::const_iterator itb = ita->begin();itb != ita->end();++itb)
{
cout<<*itb<<"\t";
}
cout<<endl;
}
cout<<endl;
return 0;
}
//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)
运行结果: