Skip to content

Commit 00e6bad

Browse files
committed
update: 015
1 parent 37f50b9 commit 00e6bad

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

note/015/README.md

+16-9
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,34 @@ A solution set is:
2121

2222
## 思路
2323

24-
题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是注意去重
24+
题意是让你从数组中找出所有三个和为 0 的元素构成的非重复序列,这样的话我们可以把数组先做下排序,然后遍历这个排序数组,用两个指针分别指向当前元素的下一个和数组尾部,判断三者的和与 0 的大小来移动两个指针,其中细节操作就是优化和去重
2525

2626
```java
2727
class 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
}

src/com/blankj/medium/_015/Solution.java

+15-8
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,29 @@
1414
*/
1515
public class Solution {
1616
public List<List<Integer>> threeSum(int[] nums) {
17-
Arrays.sort(nums);
1817
List<List<Integer>> list = new ArrayList<>();
19-
int i = 0;
20-
while (i < nums.length - 2) {
18+
int len = nums.length;
19+
if (len < 3) return list;
20+
Arrays.sort(nums);
21+
int max = nums[len - 1];
22+
if (max < 0) return list;
23+
for (int i = 0; i < len - 2; ) {
2124
if (nums[i] > 0) break;
22-
int left = i + 1, right = nums.length - 1;
25+
if (nums[i] + 2 * max < 0) {
26+
while (nums[i] == nums[++i] && i < len - 2) ;
27+
continue;
28+
}
29+
int left = i + 1, right = len - 1;
2330
while (left < right) {
2431
int sum = nums[i] + nums[left] + nums[right];
2532
if (sum == 0) {
26-
list.add(Arrays.asList(nums[i], nums[left++], nums[right--]));
27-
while (left < right && nums[left] == nums[left - 1]) ++left;
28-
while (left < right && nums[right] == nums[right + 1]) --right;
33+
list.add(Arrays.asList(nums[i], nums[left], nums[right]));
34+
while (nums[left] == nums[++left] && left < right) ;
35+
while (nums[right] == nums[--right] && left < right) ;
2936
} else if (sum < 0) ++left;
3037
else --right;
3138
}
32-
while (nums[i] == nums[++i] && i < nums.length - 2) ;
39+
while (nums[i] == nums[++i] && i < len - 2) ;
3340
}
3441
return list;
3542
}

0 commit comments

Comments
 (0)