Skip to content

Commit 0c4d100

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0015
No.0015 3Sum, see https://leetcode.com/problems/3sum/
1 parent f42c050 commit 0c4d100

File tree

10 files changed

+204
-83
lines changed

10 files changed

+204
-83
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
1. [数组中重复的数字](/lcof/面试题03.%20数组中重复的数字/README.md)
5454
1. [旋转数组](/solution/0100-0199/0189.Rotate%20Array/README.md)
55+
1. [三数之和](/solution/0000-0099/0015.3Sum/README.md)
5556

5657
### 字符串
5758

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
5151
### Arrays
5252

5353
1. [Rotate Array](/solution/0100-0199/0189.Rotate%20Array/README_EN.md)
54+
1. [3Sum](/solution/0000-0099/0015.3Sum/README_EN.md)
5455

5556
### Strings
5657

lcof/面试题18. 删除链表的节点/README.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
返回删除后的链表的头节点。
88

9-
注意:此题对比原题有改动
9+
注意:此题对比[原题](/solution/0200-0299/0237.Delete%20Node%20in%20a%20Linked%20List/README.md)有改动。
1010

1111
**示例 1:**
1212

@@ -31,9 +31,9 @@
3131

3232
## 解法
3333

34-
定义一个虚拟头节点 `dummy` 指向 `head`,再定义指针 `pre``p` 分别指向 `dummy``head`
34+
定义一个虚拟头节点 `dummy` 指向 `head`,再定义指针 `pre``cur` 分别指向 `dummy``head`
3535

36-
遍历链表,`pre``p` 往后移动。当指针 `p` 指向的节点的值等于 `val` 时,将 `pre.next` 指向 `p.next`,然后返回 `dummy.next`
36+
遍历链表,`pre``cur` 往后移动。当指针 `cur` 指向的节点的值等于 `val` 时,将 `pre.next` 指向 `cur.next`,然后返回 `dummy.next`
3737

3838
<!-- tabs:start -->
3939

@@ -49,12 +49,12 @@ class Solution:
4949
def deleteNode(self, head: ListNode, val: int) -> ListNode:
5050
dummy = ListNode(0)
5151
dummy.next = head
52-
pre, p = dummy, head
53-
while p:
54-
if p.val == val:
55-
pre.next = p.next
52+
pre, cur = dummy, head
53+
while cur:
54+
if cur.val == val:
55+
pre.next = cur.next
5656
break
57-
pre, p = p, p.next
57+
pre, cur = cur, cur.next
5858
return dummy.next
5959
```
6060

@@ -73,14 +73,14 @@ class Solution {
7373
public ListNode deleteNode(ListNode head, int val) {
7474
ListNode dummy = new ListNode(0);
7575
dummy.next = head;
76-
ListNode pre = dummy, p = head;
77-
while (p != null) {
78-
if (p.val == val) {
79-
pre.next = p.next;
76+
ListNode pre = dummy, cur = head;
77+
while (cur != null) {
78+
if (cur.val == val) {
79+
pre.next = cur.next;
8080
break;
8181
}
82-
pre = p;
83-
p = p.next;
82+
pre = cur;
83+
cur = cur.next;
8484
}
8585
return dummy.next;
8686
}

lcof/面试题18. 删除链表的节点/Solution.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ class Solution {
1010
public ListNode deleteNode(ListNode head, int val) {
1111
ListNode dummy = new ListNode(0);
1212
dummy.next = head;
13-
ListNode pre = dummy, p = head;
14-
while (p != null) {
15-
if (p.val == val) {
16-
pre.next = p.next;
13+
ListNode pre = dummy, cur = head;
14+
while (cur != null) {
15+
if (cur.val == val) {
16+
pre.next = cur.next;
1717
break;
1818
}
19-
pre = p;
20-
p = p.next;
19+
pre = cur;
20+
cur = cur.next;
2121
}
2222
return dummy.next;
2323
}

lcof/面试题18. 删除链表的节点/Solution.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ class Solution:
77
def deleteNode(self, head: ListNode, val: int) -> ListNode:
88
dummy = ListNode(0)
99
dummy.next = head
10-
pre, p = dummy, head
11-
while p:
12-
if p.val == val:
13-
pre.next = p.next
10+
pre, cur = dummy, head
11+
while cur:
12+
if cur.val == val:
13+
pre.next = cur.next
1414
break
15-
pre, p = p, p.next
15+
pre, cur = cur, cur.next
1616
return dummy.next

solution/0000-0099/0015.3Sum/README.md

+65-2
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,85 @@
2626

2727
<!-- 这里可写通用的实现逻辑 -->
2828

29+
“排序 + 双指针”实现。
30+
2931
<!-- tabs:start -->
3032

3133
### **Python3**
3234

3335
<!-- 这里可写当前语言的特殊实现逻辑 -->
3436

3537
```python
36-
38+
class Solution:
39+
def threeSum(self, nums: List[int]) -> List[List[int]]:
40+
if nums is None or len(nums) < 3:
41+
return []
42+
nums.sort()
43+
n = len(nums)
44+
res = []
45+
for i in range(n - 2):
46+
if i > 0 and nums[i] == nums[i - 1]:
47+
continue
48+
p, q = i + 1, n - 1
49+
while p < q:
50+
if p > i + 1 and nums[p] == nums[p - 1]:
51+
p += 1
52+
continue
53+
if q < n - 1 and nums[q] == nums[q + 1]:
54+
q -= 1
55+
continue
56+
if nums[i] + nums[p] + nums[q] < 0:
57+
p += 1
58+
elif nums[i] + nums[p] + nums[q] > 0:
59+
q -= 1
60+
else:
61+
res.append([nums[i], nums[p], nums[q]])
62+
p += 1
63+
q -= 1
64+
return res
3765
```
3866

3967
### **Java**
4068

4169
<!-- 这里可写当前语言的特殊实现逻辑 -->
4270

4371
```java
44-
72+
class Solution {
73+
public List<List<Integer>> threeSum(int[] nums) {
74+
int n;
75+
if (nums == null || (n = nums.length) < 3) {
76+
return Collections.emptyList();
77+
}
78+
Arrays.sort(nums);
79+
List<List<Integer>> res = new ArrayList<>();
80+
for (int i = 0; i < n - 2; ++i) {
81+
if (i > 0 && nums[i] == nums[i - 1]) {
82+
continue;
83+
}
84+
int p = i + 1, q = n - 1;
85+
while (p < q) {
86+
if (p > i + 1 && nums[p] == nums[p - 1]) {
87+
++p;
88+
continue;
89+
}
90+
if (q < n - 1 && nums[q] == nums[q + 1]) {
91+
--q;
92+
continue;
93+
}
94+
if (nums[p] + nums[q] + nums[i] < 0) {
95+
++p;
96+
} else if (nums[p] + nums[q] + nums[i] > 0) {
97+
--q;
98+
} else {
99+
res.add(Arrays.asList(nums[p], nums[q], nums[i]));
100+
++p;
101+
--q;
102+
}
103+
}
104+
}
105+
return res;
106+
}
107+
}
45108
```
46109

47110
### **...**

solution/0000-0099/0015.3Sum/README_EN.md

+63-2
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,74 @@ A solution set is:
3737
### **Python3**
3838

3939
```python
40-
40+
class Solution:
41+
def threeSum(self, nums: List[int]) -> List[List[int]]:
42+
if nums is None or len(nums) < 3:
43+
return []
44+
nums.sort()
45+
n = len(nums)
46+
res = []
47+
for i in range(n - 2):
48+
if i > 0 and nums[i] == nums[i - 1]:
49+
continue
50+
p, q = i + 1, n - 1
51+
while p < q:
52+
if p > i + 1 and nums[p] == nums[p - 1]:
53+
p += 1
54+
continue
55+
if q < n - 1 and nums[q] == nums[q + 1]:
56+
q -= 1
57+
continue
58+
if nums[i] + nums[p] + nums[q] < 0:
59+
p += 1
60+
elif nums[i] + nums[p] + nums[q] > 0:
61+
q -= 1
62+
else:
63+
res.append([nums[i], nums[p], nums[q]])
64+
p += 1
65+
q -= 1
66+
return res
4167
```
4268

4369
### **Java**
4470

4571
```java
46-
72+
class Solution {
73+
public List<List<Integer>> threeSum(int[] nums) {
74+
int n;
75+
if (nums == null || (n = nums.length) < 3) {
76+
return Collections.emptyList();
77+
}
78+
Arrays.sort(nums);
79+
List<List<Integer>> res = new ArrayList<>();
80+
for (int i = 0; i < n - 2; ++i) {
81+
if (i > 0 && nums[i] == nums[i - 1]) {
82+
continue;
83+
}
84+
int p = i + 1, q = n - 1;
85+
while (p < q) {
86+
if (p > i + 1 && nums[p] == nums[p - 1]) {
87+
++p;
88+
continue;
89+
}
90+
if (q < n - 1 && nums[q] == nums[q + 1]) {
91+
--q;
92+
continue;
93+
}
94+
if (nums[p] + nums[q] + nums[i] < 0) {
95+
++p;
96+
} else if (nums[p] + nums[q] + nums[i] > 0) {
97+
--q;
98+
} else {
99+
res.add(Arrays.asList(nums[p], nums[q], nums[i]));
100+
++p;
101+
--q;
102+
}
103+
}
104+
}
105+
return res;
106+
}
107+
}
47108
```
48109

49110
### **...**
+21-31
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,36 @@
11
class Solution {
22
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;
3+
int n;
4+
if (nums == null || (n = nums.length) < 3) {
5+
return Collections.emptyList();
86
}
9-
int p = 0;
10-
int q = 0;
7+
Arrays.sort(nums);
8+
List<List<Integer>> res = new ArrayList<>();
119
for (int i = 0; i < n - 2; ++i) {
12-
if (nums[i] > 0) {
13-
break;
14-
}
1510
if (i > 0 && nums[i] == nums[i - 1]) {
1611
continue;
1712
}
18-
19-
p = i + 1;
20-
q = n - 1;
21-
13+
int p = i + 1, q = n - 1;
2214
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]));
15+
if (p > i + 1 && nums[p] == nums[p - 1]) {
16+
++p;
17+
continue;
18+
}
19+
if (q < n - 1 && nums[q] == nums[q + 1]) {
20+
--q;
21+
continue;
22+
}
23+
if (nums[p] + nums[q] + nums[i] < 0) {
2624
++p;
27-
while (p < q && nums[p] == nums[p - 1]) {
28-
++p;
29-
}
25+
} else if (nums[p] + nums[q] + nums[i] > 0) {
3026
--q;
31-
while (p < q && nums[q] == nums[q + 1]) {
32-
--q;
33-
}
34-
3527
} else {
36-
q = val > 0 ? q - 1 : q;
37-
p = val < 0 ? p + 1 : p;
28+
res.add(Arrays.asList(nums[p], nums[q], nums[i]));
29+
++p;
30+
--q;
3831
}
39-
40-
}
32+
}
4133
}
42-
return list;
43-
34+
return res;
4435
}
45-
4636
}
+26-23
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
class Solution:
2-
def threeSum(self, nums):
3-
"""
4-
:type nums: List[int]
5-
:rtype: List[List[int]]
6-
"""
7-
dic = {}
8-
for ele in nums:
9-
dic[ele] = dic.get(ele,0) + 1
10-
neg = sorted(filter(lambda x:x<0,dic))
11-
pos = sorted(filter(lambda x:x>=0,dic))
12-
if(0 in dic and dic[0]>2):
13-
res = [[0,0,0]]
14-
else:
15-
res = []
16-
for ele1 in neg:
17-
for ele2 in pos:
18-
tar = -(ele1 + ele2)
19-
if(tar in dic):
20-
if(tar in (ele1,ele2) and dic[tar]>1):
21-
res.append([ele1,tar,ele2])
22-
elif(tar < ele1 or tar > ele2):
23-
res.append([ele1,tar,ele2])
24-
return res
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
if nums is None or len(nums) < 3:
4+
return []
5+
nums.sort()
6+
n = len(nums)
7+
res = []
8+
for i in range(n - 2):
9+
if i > 0 and nums[i] == nums[i - 1]:
10+
continue
11+
p, q = i + 1, n - 1
12+
while p < q:
13+
if p > i + 1 and nums[p] == nums[p - 1]:
14+
p += 1
15+
continue
16+
if q < n - 1 and nums[q] == nums[q + 1]:
17+
q -= 1
18+
continue
19+
if nums[i] + nums[p] + nums[q] < 0:
20+
p += 1
21+
elif nums[i] + nums[p] + nums[q] > 0:
22+
q -= 1
23+
else:
24+
res.append([nums[i], nums[p], nums[q]])
25+
p += 1
26+
q -= 1
27+
return res

0 commit comments

Comments
 (0)