题目:
解答:
参考网上的一份比较标准的代码。
做法: 先转化为求3sum 然后再转化为求2sum
通过只从小到大搜索,跳过重复元素,来达到避免结果重复的目的。
代码:
class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
int i, j, k, l, sum;
vector<int> temp;
vector<vector<int> > res;
sort(num.begin(), num.end());
for (i = 0; i < num.size(); i++)
{
if (i != 0 && num[i] == num[i - 1])
continue;
//为什么要j = i+1; 因为元素从小到大排列
//所以从小到大进行查找,肯定不会遗漏元素。
for (j = i + 1; j < num.size(); j++)
{
if (j != i + 1 && num[j] == num[j - 1])
continue;
k = j + 1; l = num.size() - 1;
while(k<l)
{
sum = num[i] + num[j] + num[k] + num[l];
if (target > sum)
{
++k;
}
else if (target < sum)
{
--l;
}
//在这里避免重复元素
else if (k != j + 1 && num[k] == num[k - 1])
{
++k;
}
//在这里避免重复元素
else if (l != num.size() - 1 && num[l] == num[l + 1])
{
--l;
}
else
{
temp.clear();
temp.push_back(num[i]);
temp.push_back(num[j]);
temp.push_back(num[k]);
temp.push_back(num[l]);
res.push_back(temp);
++k;
--l;
}
}
}
}
return res;
}
};