一、题目
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [], target = 0
输出:[]
提示:
0 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
二、题解
思路:类似于 LeetCode 15. 三数之和_xunye的博客-CSDN博客
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int size = nums.size();
if (size < 4)
return {};
std::sort(nums.begin(), nums.end());
vector<vector<int>> result;
for (int i = 0; i < size; ++i)
{
int iVal = nums[i];
if (i > 0 and iVal == nums[i - 1])
continue;
for (int k = i + 1; k < size; ++k)
{
int kVal = nums[k];
if (k > i + 1 and nums[k - 1] == kVal)
continue;
int left = k + 1;
int right = size - 1;
while (left < right)
{
int sum = iVal + kVal + nums[left] + nums[right];
if (sum == target)
{
result.push_back({iVal, kVal, nums[left], nums[right]});
while (left < right and nums[left] == nums[left + 1])
++left;
while (left < right and nums[right - 1] == nums[right])
--right;
++left;
--right;
}
else if (sum < target)
{
++left;
}
else
{
--right;
}
}
}
}
return result;
}
};