四数之和
题目类型:数组
题目来源: leetcode传送门
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
- 0 <= a, b, c, d < n
- a、b、c 和 d 互不相同
- nums[a] + nums[b] + nums[c] + nums[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 = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提示:
* 1 <= nums.length <= 200
* -109 <= nums[i] <= 109
* -109 <= target <= 109
由于之前做了三数之和,所以做这题的时候,直接的想法就是在三数之和外面套层循环就行了,即2层循环内部一个双指针即可。看了一下题解,好像没有更好的方法了,所以就直接写了,思路和三数之和解法一样,直接看代码:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> ans(0);
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i ++)
{
if(i != 0 && nums[i] == nums[i-1])
continue;
for(int j = i+1; j < nums.size(); j ++)
{
if(j != i+1 && nums[j] == nums[j-1])
continue;
int k = j + 1;
int p = nums.size() - 1;
int tar = target - nums[i] - nums[j];
while(k < p)
{
if(nums[k] + nums[p] == tar)
{
ans.push_back({nums[i], nums[j], nums[k], nums[p]});
while(k < p && nums[k+1] == nums[k])
k ++;
k ++;
}
else if(nums[k] + nums[p] < tar)
{
while(k < p && nums[k+1] == nums[k])
k ++;
k ++;
}
else
{
while(k < p && nums[p-1] == nums[p])
p --;
p --;
}
}
}
}
return ans;
}
经过这几道题的训练,双指针算是比较熟悉了。