leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-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]
]
代码:
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
//特殊情况一
if(nums.size() < 4)
return {};
//先排序
sort(nums.begin(), nums.end());
//特殊情况二
if(nums.size() == 4)
{
if(nums[0]+nums[1]+nums[2]+nums[3] == target)
return {nums};
else
return {};
}
//先固定一个数,再固定一个数,然后用夹逼法
vector<vector<int>> ret;
int i = 0, j = 0;
while(i<(nums.size()-3))
{
//去重
if(i > 0 && nums[i-1] == nums[i])
{
i++;
continue;
}
j = nums.size()-1;
while(j >= (i+3))
{
//去重
if((j < nums.size()-1 ) && nums[j+1] == nums[j])
{
j--;
continue;
}
int temp1 = nums[i] + nums[j];
for(int k = i+1, l = j - 1; l>k;)
{
//去重
if(k > (i+1) && nums[k-1] == nums[k])
{
k++;
continue;
}
//去重
if((l < (j-1) ) && nums[l+1] == nums[l])
{
l--;
continue;
}
int temp2 = nums[k] + nums[l];
if( (temp1 + temp2) == target)
{
ret.push_back({nums[i],nums[k],nums[l],nums[j]});
k++;
}
else if( (temp1 + temp2) > target )
l--;
else
k++;
}
j--;
}
i++;
}
return ret;
}
};