leetcode:18. 四数之和 - 力扣(LeetCode)
题目
题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
思路
跟上篇的三数之和异曲同工,就是在i的for循环前面再套一层for循环(假设为k),这样子就是固定k和i,然后L和R进行区间内的滑动。
class Solution
{
public:vector<vector<int>> fourSum(vector<int> &nums, int target){vector<vector<int>> result;sort(nums.begin(), nums.end());for (int k = 0; k < nums.size(); k++){if (nums[k] > target && nums[k] >= 0){break;}if (k > 0 && nums[k] == nums[k - 1]){continue;}for (int i = k + 1; i < nums.size(); i++){if (nums[i] + nums[k] > target && nums[i] + nums[k] >= 0){break;}if (i > k + 1 && nums[i] == nums[i - 1]){continue;}int left = i + 1, right = nums.size() - 1;while (left < right){int sum = nums[k] + nums[i] + nums[left] + nums[right];if (sum > target){right--;}else if (sum < target){left++;}else{result.push_back({nums[k], nums[i], nums[left], nums[right]});while (left < right && nums[right] == nums[right - 1]){right--;}while (left < right && nums[left] == nums[left + 1]){left++;}left++;right--;}}}}return result;}
};
总结
注意这里的target不是0,所以剪枝的条件需要改变。
在对i进行剪枝的时候,判断条件是:
if (nums[i] + nums[k] > target && nums[i] + nums[k] >= 0)
因为在两层for循环里面,累积值是两个数之和。
参考资料
代码随想录
难在去重和剪枝!| LeetCode:18. 四数之和_哔哩哔哩_bilibili