Skip to content

Commit a7daafb

Browse files
author
houfachao
committed
15. 三数之和
1 parent d0e3eb0 commit a7daafb

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

Diff for: src/main/java/com/geekidentity/leetcode/n0015/ThreeSum.java

+15-19
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,24 @@ public List<List<Integer>> threeSum1(int[] nums) {
2727

2828
public List<List<Integer>> threeSum2(int[] nums) {
2929
List<List<Integer>> result = new ArrayList<>();
30+
if (nums.length < 3) return result;
3031
Arrays.sort(nums);
3132
for (int i = 0; i < nums.length - 2; i++) {
32-
// 去掉重复情况
33-
if (i > 0 && nums[i] == nums[i - 1]) continue;
34-
for (int j = i + 1, k = nums.length - 1; j < k;) {
35-
int target = -nums[i];
36-
int sum = nums[j] + nums[k];
37-
if (sum == target) {
38-
// 加 left,减小 right,但是不能重复,比如: [-2, -1, -1, -1, 3, 3, 3], i = 0, left = 1, right = 6, [-2, -1, 3] 的答案加入后,需要排除重复的 -1 和 3
39-
result.add(Arrays.asList(nums[i], nums[j], nums[k]));
40-
j++;
41-
k--;
42-
while (j < k && nums[j] == nums[j - 1]) {
43-
j++;
44-
}
45-
while (j < k && nums[k] == nums[k + 1]) {
46-
k--;
47-
}
48-
} else if (sum < target) {
49-
j++;
33+
if (nums[i] > 0) continue;
34+
if (i > 0 && nums[i] == nums[i - 1]) i++;
35+
int left = i + 1, right = nums.length - 1;
36+
while (left < right) {
37+
int sum = nums[i] + nums[left] + nums[right];
38+
if (sum > 0) {
39+
right--;
40+
} else if (sum < 0) {
41+
left++;
5042
} else {
51-
k--;
43+
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
44+
while (left < right && nums[left] == nums[left + 1]) left++;
45+
while (left < right && nums[right] == nums[right - 1]) right--;
46+
left++;
47+
right--;
5248
}
5349
}
5450
}

0 commit comments

Comments
 (0)