leetcode18. 四数之和
原文链接:https://blog.csdn.net/qq_39355828/article/details/120414388 (opens new window)
- 四数之和
给你一个由 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]]
public static List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>>ans=new ArrayList<List<Integer>>();
if(nums==null&&nums.length<4)
return ans;
Arrays.sort(nums);
int length=nums.length;
for(int i=0;i<length-3;i++)
{
//去除重复的数字
if(i>0&&nums[i]==nums[i-1])
continue;
//如果已经出现当前的值比目标值更大,应该跳出循环
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)
break;
//小于目标值,则应该越过本次循环
//细节,不能再像上面一样,不然会漏解很多情况
if(nums[i]+nums[length-3] + nums[length - 2] + nums[length-1] <target)
continue;
//排除以上的情况,则说明当前已经满足情况了,则需要进行下一步的搜索,可能存在多个解
for(int j=i+1;j<length-2;j++)//开始再搜索多个解的情况
{
//同样的,第一步去除重复的解
if(j>i+1&&nums[j]==nums[j-1])
continue;//重复则跳出本次的循环
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)
break;
//小于目标值,则应该跳过本次循环,继续搜索
if(nums[i]+nums[length-3] + nums[length - 2] + nums[length-1]<target)
continue;
//排除上述情况之后,就只剩下相等了,使用双指针进行判断
int left=j+1,right=length-1;//左右指针进行搜索
while(left<right)
{
int sum=nums[i]+nums[j]+nums[left]+nums[right];
if(sum==target)
{
ans.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(left<right&&nums[left]==nums[left+1])
left++;
left++;
while(left<right&&nums[right]==nums[right-1])
right--;
right--;
}
else if(sum<target)
left++;
else right--;
}
}
}
return ans;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
编辑 (opens new window)
上次更新: 2026/08/11, 13:36:18