@@ -21,27 +21,34 @@ A solution set is:
21
21
22
22
## 思路
23
23
24
- 题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是注意去重 。
24
+ 题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是优化和去重 。
25
25
26
26
``` java
27
27
class Solution {
28
28
public List<List<Integer > > threeSum (int [] nums ) {
29
- Arrays . sort(nums);
30
29
List<List<Integer > > list = new ArrayList<> ();
31
- int i = 0 ;
32
- while (i < nums. length - 2 ) {
30
+ int len = nums. length;
31
+ if (len < 3 ) return list;
32
+ Arrays . sort(nums);
33
+ int max = nums[len - 1 ];
34
+ if (max < 0 ) return list;
35
+ for (int i = 0 ; i < len - 2 ; ) {
33
36
if (nums[i] > 0 ) break ;
34
- int left = i + 1 , right = nums. length - 1 ;
37
+ if (nums[i] + 2 * max < 0 ) {
38
+ while (nums[i] == nums[++ i] && i < len - 2 ) ;
39
+ continue ;
40
+ }
41
+ int left = i + 1 , right = len - 1 ;
35
42
while (left < right) {
36
43
int sum = nums[i] + nums[left] + nums[right];
37
44
if (sum == 0 ) {
38
- list. add(Arrays . asList(nums[i], nums[left++ ], nums[right-- ]));
39
- while (left < right && nums[left] == nums[left - 1 ]) ++ left ;
40
- while (left < right && nums[right] == nums[right + 1 ]) -- right;
45
+ list. add(Arrays . asList(nums[i], nums[left], nums[right]));
46
+ while (nums[left] == nums[++ left] && left < right) ;
47
+ while (nums[right] == nums[-- right] && left < right) ;
41
48
} else if (sum < 0 ) ++ left;
42
49
else -- right;
43
50
}
44
- while (nums[i] == nums[++ i] && i < nums . length - 2 ) ;
51
+ while (nums[i] == nums[++ i] && i < len - 2 ) ;
45
52
}
46
53
return list;
47
54
}
0 commit comments