题目: https://oj.leetcode.com/problems/4sum/
代码:
对于这类问题首先需要将数组进行整体排序。然后比较某两个数是否存在和target-这两个数和 相等的两个数。
值得注意的是,要考虑到重复的情况,所以需要用set之类作区分。
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
vector< vector<int> > res;
sort(num.begin(), num.end());
int size = num.size();
set<int>s;
for (int i = 0; i < size; i++)
{
if (s.find(num[i]) == s.end())
{
s.insert(num[i]);
for (int j = i + 1; j < size; j++)
{
while (j != i + 1 && num[j] == num[j - 1] && j<size) j++;
get_triplus(i, j, num, res, j + 1, size - 1, target);
}
}
}
return res;
}
void get_triplus(int indexone, int indextwo, vector<int>&num, vector< vector<int> > &res, int begin, int end, int target)
{
while (begin < end)
{
if (num[indexone] + num[indextwo] + num[begin] + num[end] == target)
{
putRes(num[indexone], num[indextwo], num[begin], num[end], res);
while (begin < end && num[begin] == num[begin + 1]) begin++;
begin++;
while (begin < end && num[end] == num[end - 1]) end--;
end--;
}
else if (num[indexone] + num[indextwo] + num[begin] + num[end] > target) end--;
else begin++;
}
}
void putRes(int a, int b, int c, int d, vector< vector<int> >& res)
{
vector<int>tmp;
tmp.push_back(a);
tmp.push_back(b);
tmp.push_back(c);
tmp.push_back(d);
res.push_back(tmp);
}
};