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. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结