Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 00e6bad

Browse filesBrowse files
committed
update: 015
1 parent 37f50b9 commit 00e6bad
Copy full SHA for 00e6bad

File tree

Expand file treeCollapse file tree

2 files changed

+31
-17
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+31
-17
lines changed

‎note/015/README.md

Copy file name to clipboardExpand all lines: note/015/README.md
+16-9Lines changed: 16 additions & 9 deletions
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

Copy file name to clipboardExpand all lines: src/com/blankj/medium/_015/Solution.java
+15-8Lines changed: 15 additions & 8 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.