Skip to content

Commit 232be8c

Browse files
committed
Add solution 015
1 parent f80d373 commit 232be8c

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Complete solutions to Leetcode problems, updated daily.
3838
| # | Title | Tags |
3939
|---|---|---|
4040
| 002 | [Add Two Numbers](https://github.com/yanglbme/leetcode/tree/master/solution/002.Add%20Two%20Numbers) | `Linked List`, `Math` |
41+
| 015 | [3Sum](https://github.com/yanglbme/leetcode/tree/master/solution/015.3Sum) | `Array`, `Two Pointers` |
4142
| 019 | [Remove Nth Node From End of List](https://github.com/yanglbme/leetcode/tree/master/solution/019.Remove%20Nth%20Node%20From%20End%20of%20List) | `Linked List`, `Two Pointers` |
4243
| 024 | [Swap Nodes in Pairs](https://github.com/yanglbme/leetcode/tree/master/solution/024.Swap%20Nodes%20in%20Pairs) | `Linked List` |
4344
| 046 | [Permutations](https://github.com/yanglbme/leetcode/tree/master/solution/046.Permutations) | `Backtracking` |

solution/015.3Sum/README.md

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
## 三数之和
2+
### 题目描述
3+
4+
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
5+
6+
注意:答案中不可以包含重复的三元组。
7+
```
8+
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
9+
10+
满足要求的三元组集合为:
11+
[
12+
[-1, 0, 1],
13+
[-1, -1, 2]
14+
]
15+
```
16+
17+
### 解法
18+
先对数组进行排序,遍历数组,固定第一个数i。利用两个指针 p, q 分别指示 i+1, n-1。如果三数之和为0,移动 p, q;如果大于 0,左移 q;如果小于 0,右移 p。遍历到 nums[i] > 0 时,退出循环。
19+
20+
```java
21+
class Solution {
22+
public List<List<Integer>> threeSum(int[] nums) {
23+
List<List<Integer>> list = new ArrayList<>();
24+
Arrays.sort(nums);
25+
int n = nums.length;
26+
if (n < 3) {
27+
return list;
28+
}
29+
int p = 0;
30+
int q = 0;
31+
for (int i = 0; i < n - 2; ++i) {
32+
if (nums[i] > 0) {
33+
break;
34+
}
35+
if (i > 0 && nums[i] == nums[i - 1]) {
36+
continue;
37+
}
38+
39+
p = i + 1;
40+
q = n - 1;
41+
42+
while (p < q) {
43+
int val = nums[p] + nums[q] + nums[i];
44+
if (val == 0) {
45+
list.add(Arrays.asList(nums[i], nums[p], nums[q]));
46+
++p;
47+
while (p < q && nums[p] == nums[p - 1]) {
48+
++p;
49+
}
50+
--q;
51+
while (p < q && nums[q] == nums[q + 1]) {
52+
--q;
53+
}
54+
55+
} else {
56+
q = val > 0 ? q - 1 : q;
57+
p = val < 0 ? p + 1 : p;
58+
}
59+
60+
}
61+
}
62+
return list;
63+
64+
}
65+
66+
}
67+
```

solution/015.3Sum/Solution.java

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public List<List<Integer>> threeSum(int[] nums) {
3+
List<List<Integer>> list = new ArrayList<>();
4+
Arrays.sort(nums);
5+
int n = nums.length;
6+
if (n < 3) {
7+
return list;
8+
}
9+
int p = 0;
10+
int q = 0;
11+
for (int i = 0; i < n - 2; ++i) {
12+
if (nums[i] > 0) {
13+
break;
14+
}
15+
if (i > 0 && nums[i] == nums[i - 1]) {
16+
continue;
17+
}
18+
19+
p = i + 1;
20+
q = n - 1;
21+
22+
while (p < q) {
23+
int val = nums[p] + nums[q] + nums[i];
24+
if (val == 0) {
25+
list.add(Arrays.asList(nums[i], nums[p], nums[q]));
26+
++p;
27+
while (p < q && nums[p] == nums[p - 1]) {
28+
++p;
29+
}
30+
--q;
31+
while (p < q && nums[q] == nums[q + 1]) {
32+
--q;
33+
}
34+
35+
} else {
36+
q = val > 0 ? q - 1 : q;
37+
p = val < 0 ? p + 1 : p;
38+
}
39+
40+
}
41+
}
42+
return list;
43+
44+
}
45+
46+
}

0 commit comments

Comments
 (0)