学习安排根据《代码随想录》leetcode18
跟昨天的《三数之和》有异曲同工之妙,弄懂了话,代码还是很好写的,但依然有问题需要注意:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
int len=nums.size();
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
//i去重
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
for (int j = i + 1; j < len; j++)
{
/*
if(nums[i]+nums[j]>target)
return result;
*/
//j去重
if (j> i + 1 && nums[j] == nums[j - 1]) {
continue;
}
int left = j + 1;
int right = len - 1;
while (right > left) {
if (nums[i] + nums[j] > target - (nums[left] + nums[right]))
right--;
else if (nums[i] + nums[j] < target - (nums[left] + nums[right]))
left++;
else {
result.push_back({nums[i], nums[j], nums[left], nums[right]});
//取值相同时,去重
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时压缩
right--;
left++;
}
}
}
}
return result;
}
};
这里 有涉及 几个难理解的点:
1. i/j的去重
2.溢出 【用例太大 超出 int可以表示的范围】
nums[k] + nums[i] + nums[left] + nums[right] > target 会溢出
nums[k] + nums[i] + nums[left] + nums[right] < target 会溢出
3. 三数之和 需要判断 nums[i]>0,四数之和不用判断 nums[i]+nums[j]>target,这个暂时还不太懂
if(nums[i]+nums[j]>target)
return result;