题目描述

和leetcode 15. 三数之和用同样的方法。有两个注意点。
一是剪枝的逻辑
这是和15. 三数之和 - 力扣(LeetCode)问题不同的地方。

无法通过这种情况:

二是整数溢出


最终答案
cpp
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int len = nums.size();
int left = 0;
int right = 0;
vector<vector<int>> res;
for(int i = 0;i <len;i++){
if(nums[i]>0 && nums[i]>=target)
break;
if(i>0&&nums[i-1]==nums[i])
continue;
for(int j=i+1;j <len;j++){
if(nums[j]>0 && nums[i]+nums[j] >= target)
break;
if(j>i+1 && nums[j-1]==nums[j])
continue;
left=j+1;
right=len-1;
while(left<right){
if((long)nums[i]+nums[j]+nums[left]+nums[right] == target){
res.push_back({nums[i],nums[j],nums[left],nums[right]});
while(left<right-1&&nums[left]==nums[left+1]) left++;
while(left<right-1&&nums[right]==nums[right-1]) right--;
left++;
right--;
}
else if((long)nums[i]+nums[j]+nums[left]+nums[right] > target){
right--;
}else{
left++;
}
}
}
}
return res;
}
};