leetcode 18. 四数之和
题目描述

和leetcode 15. 三数之和用同样的方法。有两个注意点。
一是剪枝的逻辑
这是和15. 三数之和 - 力扣(LeetCode)问题不同的地方。
无法通过这种情况:
二是整数溢出
最终答案
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;}
};