力扣 18 四数之和
18. 四数之和
给你一个由n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < na、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
先理解最接近的。
一、排序
将nums排序
二、a,b去重
1 for(int i=0;i){ 2 if(i==0||nums[i]!=nums[i-1]) 3 for(int j=i+1;j ){ 4 if(j==i+1||nums[j]!=nums[j-1]){
三、循环和双指针
先用i和j 循环a和b的下标,接下来那么l和r就是c,d的,刚开始l在最左边,r在最右边,判断当前值tmp,
tmp>target,说明当前和过大了,应该让tmp减小,所以r左移,r--
tmp tmp==target,记录当前abcd,l++同时r--四、c,d去重
1 if(tmp==target){
2
3 res.push_back({nums[i],nums[j],nums[l],nums[r]});
4
5 if((nums[r]==nums[r-1])||(nums[l]==nums[l+1])){
6 while(r>l&&(nums[r]==nums[r-1]))
7 r--;
8 while(r>l&&(nums[l]==nums[l+1]))
9 l++;
10 }
11 else
12 r--;l++;
13
14
15 }
五、代码
1 class Solution {
2 public:
3 vector