题目
给定一个包含 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]
]
解法 4指针
解法与3指针无异,无非是N - 2个3指针子问题。多考虑一层指针,同时注意去重。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
int len = nums.size();
vector<vector<int>> result;
if(len < 4)
return result;
int p1 = 0, p2 = 0, p3 = 0, p4 = 0;
sort(nums.begin(),nums.end(),less<int>());
for(; p1 < len - 3 ; p1++)
{
if(p1 > 0 && nums[p1] == nums[p1 - 1])
continue;
for(p2 = p1 + 1; p2 < len - 2;p2++)
{
//cout << p2;
if(p2 > p1 + 1 && nums[p2] == nums[p2 - 1])
continue;
p3 = p2 + 1;
p4 = len - 1;
int cur_tar = target - nums[p1] - nums[p2];
while(p3 < p4)
{
//cout << p3;
if(nums[p3] + nums[p4] > cur_tar)
p4--;
else if(nums[p3] + nums[p4] < cur_tar)
p3++;
else{
vector<int> tmp = {nums[p1],nums[p2],nums[p3],nums[p4]};
result.push_back(tmp);
while(p3 < p4 && (p4 > 0) && nums[p4] == nums[p4 - 1])
p4--;
while(p3 < p4 && (p3 < len - 1) && nums[p3] == nums[p3 + 1])
p3++;
p4--;
p3++;
}
}
}
}
return result;
}
};