18. 四数之和

Posted boboboo610

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18. 四数之和相关的知识,希望对你有一定的参考价值。

给定一个包含 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]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

法一:

 1     public List<List<Integer>> fourSum(int[] nums, int target) {
 2         if (nums == null || nums.length < 4)
 3             return new ArrayList<>();
 4 
 5         List<List<Integer>> ans = new ArrayList<>();
 6         Arrays.sort(nums);
 7         int len = nums.length;
 8         int sum = 0;
 9 
10         for (int i = 0; i < len - 3; i++) {
11             if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target)
12                 break;//第i次循环中,最小可能值大于目标值 不用后续循环
13 
14             if (nums[i] + nums[len - 1] + nums[len - 2] + nums[len - 3] < target)
15                 continue;//第i次循环中,最大可能值小于目标值 不用本次循环
16 
17             if (i > 0 && nums[i] == nums[i - 1])
18                 continue;//去重
19 
20             for (int j = i + 1; j < len - 2; j++) {
21                 if (nums[i] + nums[j] + nums[j+1] + nums[j+2] > target)
22                     break;//最小可能值大于目标值 不用后续循环
23 
24                 if (nums[i] + nums[j] + nums[len - 1] + nums[len - 2] < target)
25                     continue;//最大可能值小于目标值 不用本次循环
26 
27                 if (j > i+1 && nums[j] == nums[j - 1])
28                     continue;//去重
29 
30                 int l = j + 1, r = len - 1;
31                 while (l < r) {
32                     sum = nums[i] + nums[j] + nums[l] + nums[r];
33                     if (sum == target) {
34                         ans.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));
35                         while (l < r && nums[r] == nums[r - 1])
36                             r--;//去重
37                         while (l < r && nums[l] == nums[l + 1])
38                             l++;//去重
39 
40                         r--;
41                         l++;
42                     } else if (sum < target) {
43                         l++;
44                     } else {
45                         r--;
46                     }
47                 }
48             }
49         }
50         return ans;
51     }

类似15题 多套一层循环,定住第一个第二个数,第三第四个数做双指针

以上是关于18. 四数之和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 18. 四数之和

leetcode-----18. 四数之和

LeetCode 18. 四数之和

leetcode 每日一题 18. 四数之和

18. 四数之和

Java算法 每日一题 编号18:四数之和