15. 三数之和

Posted boboboo610

tags:

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

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

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

 

法一:

 1  public List<List<Integer>> threeSum(int[] nums) {
 2         if (nums == null || nums.length < 3)
 3             return new ArrayList<>();
 4         List<List<Integer>> ans = new ArrayList<>();
 5         Arrays.sort(nums);
 6         int len = nums.length;
 7 
 8         for (int i = 0; i < len - 2; i++) {
 9             //最小的都大于零,直接返回空数组
10             if (nums[i] > 0)
11                 return ans;
12             if(i > 0 && nums[i] == nums[i-1])//nums[i]去重
13                 continue;
14             //以nums[i]为基准,nums[l]和nums[r],向中心遍历靠拢求和
15             int l = i + 1, r = len - 1;
16             while (l<r){
17                 int sum = nums[i] + nums[l] + nums[r];
18                 if(sum == 0){
19                     ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
20                     while (l<r && nums[r] == nums[r-1])//nums[r]去重
21                         r--;
22                     while (l<r && nums[l] == nums[l+1])//nums[l]去重
23                         l++;
24 
25                     l++;
26                     r--;
27                 }
28                 if(sum <0 )
29                     l++;
30                 if(sum>0)
31                     r--;
32             }
33         }
34         return ans;
35 
36     }

确定基准数a[i],在双指针求和

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

15. 三数之和

LeetCode 15. 三数之和

15.三数之和

代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

15.三数之和

代码随想录算法训练营第七天 | 454.四数相加II ,383. 赎金信 ,15. 三数之和,18. 四数之和