Leecode 18
思路:
两数之和用双指针,三数之和,固定第一个,再用双指针,四数之和在三数之和上多加一层循环就好了,另外注意同一个位置得前后两个数字不要重复。
代码:
std::vector<std::vector<int>> Leecode18_fourSum(std::vector<int>& nums, int target){
sort(nums.begin(), nums.end());
std::vector<std::vector<int>> result;
int size = nums.size();
for (int a = 0; a < size - 3; ++a){
if (a > 0 && nums[a] == nums[a - 1]) continue;//第一个不重
for (int b = a + 1; b < size - 2; ++b){
if (b > a + 1 && nums[b] == nums[b - 1]) continue;//第二个不重
int i = b + 1, j = size - 1;
while (i < j) {
int sum = nums[a] + nums[b] + nums[i] + nums[j];
if (sum < target)
while (i < j && nums[i] == nums[++i]);
else if (sum > target)
while (i < j && nums[j] == nums[--j]);
else {
result.push_back({nums[a], nums[b], nums[i], nums[j]});
while (i < j && nums[i] == nums[++i]);//第三个不重
while (i < j && nums[j] == nums[--j]);//第四个不重
}
}
}
}
return result;
}