四数之和的解法和三数之和的类似,双指针思想,双循环先确定两个数,剩下的两个数设置双指针,一个在前边,一个指向最后一个数,变成了求两数之和的问题。
注意:nums[i]+nums[j]+nums[l]+nums[r]四个数相加的时候,要注意溢出的问题。
注意:去重。第一个数遍历结束,但是当第二个数与前一个数一样的时候,就不需要再遍历一次了,可以跳过。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
if (nums.size() < 4) {
return res;
}
sort(nums.begin(),nums.end());
for (int i = 0; i < nums.size()-3; i++) {
if (i > 0 && (nums[i] == nums[i - 1])) {
continue;
}
for (int j = i + 1; j < nums.size(); j++) {
if (j > i + 1 && nums[j] == nums[j - 1])
continue;
int l = j + 1;
int r = nums.size() - 1;
while (l < r) {
if ((long)nums[i] + nums[j] + nums[l] + nums[r] == target) {
res.push_back({ nums[i],nums[j],nums[l],nums[r] });
while (l < r && nums[l + 1] == nums[l])
l++;
while (l < r && nums[r - 1] == nums[r])
r--;
l++;
r--;
}
else if (((long)nums[i] + nums[j] + nums[l] + nums[r]) > target)
r--;
else
l++;
}
}
}
return res;
}
};