@@ -21,27 +21,34 @@ A solution set is:
2121
2222## 思路
2323
24- 题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是注意去重 。
24+ 题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是优化和去重 。
2525
2626``` java
2727class Solution {
2828 public List<List<Integer > > threeSum (int [] nums ) {
29- Arrays . sort(nums);
3029 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 ; ) {
3336 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 ;
3542 while (left < right) {
3643 int sum = nums[i] + nums[left] + nums[right];
3744 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) ;
4148 } else if (sum < 0 ) ++ left;
4249 else -- right;
4350 }
44- while (nums[i] == nums[++ i] && i < nums . length - 2 ) ;
51+ while (nums[i] == nums[++ i] && i < len - 2 ) ;
4552 }
4653 return list;
4754 }
0 commit comments