1.题目描述:
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
2.解题思路
- 首先按升序排序;然后定义下标变量i,j,k,因为是三元组,所以要三个变量如果简单的遍历,那么跟是否有序没有关系,其时间复杂度将达到O(n^3)。仔细想想:如果当前选择了a、b、c三个数,如果其和小于目标target,那么需要将其中一个数用更大的数替换;反之亦然。但究竟替换三个数中的哪个数?无法确定就只能先固定两个变量,让其第三个变化(替换)。一种办法是:固定前两个数i,j,然后让k在一个范围中二分变化(二分查找思想)
3.代码
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
| class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> list = new ArrayList(); Arrays.sort(nums); List<Integer> targets = new ArrayList<>(); if((nums.length>0 && nums.length<3) ||(nums.length>0 &&nums[0]>0)) return list; for(int i = 0;i<=nums.length-3;i++) { int target = 0 - nums[i]; if (!targets.contains(target)) { targets.add(target); int k = i + 1; int j = nums.length - 1; while (k < j) { if (nums[k] + nums[j] == target) { List<Integer> li = new ArrayList(); li.add(nums[i]); li.add(nums[k]); li.add(nums[j]); list.add(li); while (k < j && nums[k] == nums[k + 1]) ++k; while (k < j && nums[j] == nums[j - 1]) --j; k++; j--; } else if (nums[k] + nums[j] < target) { k++; } else { j--; } } } } return list; } }
|
4.我的提交记录
