Skip to content

Commit b13d582

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0018
See https://leetcode-cn.com/problems/4sum
1 parent 7f8987f commit b13d582

File tree

6 files changed

+205
-103
lines changed

6 files changed

+205
-103
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
1. [数组中重复的数字](/lcof/面试题03.%20数组中重复的数字/README.md)
5454
1. [旋转数组](/solution/0100-0199/0189.Rotate%20Array/README.md)
5555
1. [三数之和](/solution/0000-0099/0015.3Sum/README.md)
56+
1. [四数之和](/solution/0000-0099/0018.4Sum/README.md)
5657

5758
### 字符串
5859

README_EN.md

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

5353
1. [Rotate Array](/solution/0100-0199/0189.Rotate%20Array/README_EN.md)
5454
1. [3Sum](/solution/0000-0099/0015.3Sum/README_EN.md)
55+
1. [4Sum](/solution/0000-0099/0018.4Sum/README_EN.md)
5556

5657
### Strings
5758

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

+75-2
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,95 @@
2727

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

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

3234
### **Python3**
3335

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

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

4072
### **Java**
4173

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

4476
```java
45-
77+
class Solution {
78+
public List<List<Integer>> fourSum(int[] nums, int target) {
79+
int n;
80+
if (nums == null || (n = (nums.length)) < 4) {
81+
return Collections.emptyList();
82+
}
83+
Arrays.sort(nums);
84+
List<List<Integer>> res = new ArrayList<>();
85+
for (int i = 0; i < n - 3; ++i) {
86+
if (i > 0 && nums[i] == nums[i - 1]) {
87+
continue;
88+
}
89+
for (int j = i + 1; j < n - 2; ++j) {
90+
if (j > i + 1 && nums[j] == nums[j - 1]) {
91+
continue;
92+
}
93+
int p = j + 1, q = n - 1;
94+
while (p < q) {
95+
if (p > j + 1 && nums[p] == nums[p - 1]) {
96+
++p;
97+
continue;
98+
}
99+
if (q < n - 1 && nums[q] == nums[q + 1]) {
100+
--q;
101+
continue;
102+
}
103+
int t = nums[i] + nums[j] + nums[p] + nums[q];
104+
if (t == target) {
105+
res.add(Arrays.asList(nums[i], nums[j], nums[p], nums[q]));
106+
++p;
107+
--q;
108+
} else if (t < target) {
109+
++p;
110+
} else {
111+
--q;
112+
}
113+
}
114+
}
115+
}
116+
return res;
117+
}
118+
}
46119
```
47120

48121
### **...**

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

+73-2
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,84 @@ A solution set is:
3939
### **Python3**
4040

4141
```python
42-
42+
class Solution:
43+
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
44+
res = []
45+
if nums is None or len(nums) < 4:
46+
return res
47+
n = len(nums)
48+
nums.sort()
49+
for i in range(n - 3):
50+
if i > 0 and nums[i] == nums[i - 1]:
51+
continue
52+
for j in range(i + 1, n - 2):
53+
if j > i + 1 and nums[j] == nums[j - 1]:
54+
continue
55+
p, q = j + 1, n - 1
56+
while p < q:
57+
if p > j + 1 and nums[p] == nums[p - 1]:
58+
p += 1
59+
continue
60+
if q < n - 1 and nums[q] == nums[q + 1]:
61+
q -= 1
62+
continue
63+
t = nums[i] + nums[j] + nums[p] + nums[q]
64+
if t == target:
65+
res.append([nums[i], nums[j], nums[p], nums[q]])
66+
p += 1
67+
q -= 1
68+
elif t < target:
69+
p += 1
70+
else:
71+
q -= 1
72+
return res
4373
```
4474

4575
### **Java**
4676

4777
```java
48-
78+
class Solution {
79+
public List<List<Integer>> fourSum(int[] nums, int target) {
80+
int n;
81+
if (nums == null || (n = (nums.length)) < 4) {
82+
return Collections.emptyList();
83+
}
84+
Arrays.sort(nums);
85+
List<List<Integer>> res = new ArrayList<>();
86+
for (int i = 0; i < n - 3; ++i) {
87+
if (i > 0 && nums[i] == nums[i - 1]) {
88+
continue;
89+
}
90+
for (int j = i + 1; j < n - 2; ++j) {
91+
if (j > i + 1 && nums[j] == nums[j - 1]) {
92+
continue;
93+
}
94+
int p = j + 1, q = n - 1;
95+
while (p < q) {
96+
if (p > j + 1 && nums[p] == nums[p - 1]) {
97+
++p;
98+
continue;
99+
}
100+
if (q < n - 1 && nums[q] == nums[q + 1]) {
101+
--q;
102+
continue;
103+
}
104+
int t = nums[i] + nums[j] + nums[p] + nums[q];
105+
if (t == target) {
106+
res.add(Arrays.asList(nums[i], nums[j], nums[p], nums[q]));
107+
++p;
108+
--q;
109+
} else if (t < target) {
110+
++p;
111+
} else {
112+
--q;
113+
}
114+
}
115+
}
116+
}
117+
return res;
118+
}
119+
}
49120
```
50121

51122
### **...**
+24-99
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,42 @@
11
class Solution {
22
public List<List<Integer>> fourSum(int[] nums, int target) {
3-
4-
List<List<Integer>> re = new ArrayList<>();
5-
if (nums == null || nums.length < 4) {
6-
return re;
3+
int n;
4+
if (nums == null || (n = (nums.length)) < 4) {
5+
return Collections.emptyList();
76
}
87
Arrays.sort(nums);
9-
for (int i = 0; i < nums.length - 3; i++) {
10-
11-
// 当 nums[i] 对应的最小组合都大于 target 时,后面大于 nums[i] 的组合必然也大于 target,
12-
if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
13-
break;
14-
}
15-
// 当 nums[i] 对应的最大组合都小于 target 时, nums[i] 的其他组合必然也小于 target
16-
if (nums[i] + nums[nums.length - 3] + nums[nums.length - 2] + nums[nums.length - 1] < target) {
8+
List<List<Integer>> res = new ArrayList<>();
9+
for (int i = 0; i < n - 3; ++i) {
10+
if (i > 0 && nums[i] == nums[i - 1]) {
1711
continue;
1812
}
19-
20-
int firstNum = nums[i];
21-
for (int j = i + 1; j < nums.length - 2; j++) {
22-
23-
// nums[j] 过大时,与 nums[i] 过大同理
24-
if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
25-
break;
26-
}
27-
// nums[j] 过小时,与 nums[i] 过小同理
28-
if (nums[i] + nums[j] + nums[nums.length - 2] + nums[nums.length - 1] < target) {
13+
for (int j = i + 1; j < n - 2; ++j) {
14+
if (j > i + 1 && nums[j] == nums[j - 1]) {
2915
continue;
3016
}
31-
32-
int twoSum = target - nums[i] - nums[j];
33-
int l = j + 1;
34-
int k = nums.length - 1;
35-
while (l < k) {
36-
int tempSum = nums[l] + nums[k];
37-
if (tempSum == twoSum) {
38-
ArrayList<Integer> oneGroup = new ArrayList<>(4);
39-
oneGroup.add(nums[i]);
40-
oneGroup.add(nums[j]);
41-
oneGroup.add(nums[l++]);
42-
oneGroup.add(nums[k--]);
43-
re.add(oneGroup);
44-
while (l < nums.length && l < k && nums[l] == oneGroup.get(2) && nums[k] == oneGroup.get(3)) {
45-
l++;
46-
k--;
47-
}
48-
} else if (tempSum < twoSum) {
49-
l++;
50-
} else {
51-
k--;
52-
}
53-
}
54-
// 跳过重复项
55-
while ((j < nums.length - 2) && (twoSum + nums[i] + nums[j + 1] == target)) {
56-
j++;
57-
}
58-
}
59-
// 跳过重复项
60-
while (i < nums.length - 3 && nums[i + 1] == firstNum) {
61-
i++;
62-
}
63-
}
64-
return re;
65-
}
66-
}
67-
68-
/*
69-
70-
class Solution {
71-
public List<List<Integer>> fourSum(int[] nums, int target) {
72-
Arrays.sort(nums);
73-
int n = nums.length;
74-
List<List<Integer>> list = new ArrayList<>();
75-
int p = 0;
76-
int q = 0;
77-
for (int i = 0; i < n - 3; ++i) {
78-
for (int j = i + 1; j < n - 2; ++j) {
79-
p = j + 1;
80-
q = n - 1;
17+
int p = j + 1, q = n - 1;
8118
while (p < q) {
82-
int val = nums[i] + nums[j] + nums[p] + nums[q];
83-
if (val == target) {
84-
list.add(Arrays.asList(nums[i], nums[j], nums[p], nums[q]));
85-
// p 指针右移,直到 nums[p] 与 nums[p - 1] 不等
19+
if (p > j + 1 && nums[p] == nums[p - 1]) {
8620
++p;
87-
while (p < q && nums[p] == nums[p - 1]) {
88-
++p;
89-
}
21+
continue;
22+
}
23+
if (q < n - 1 && nums[q] == nums[q + 1]) {
9024
--q;
91-
while (p < q && nums[q] == nums[q + 1]) {
92-
--q;
93-
}
94-
} else if (val > target) {
25+
continue;
26+
}
27+
int t = nums[i] + nums[j] + nums[p] + nums[q];
28+
if (t == target) {
29+
res.add(Arrays.asList(nums[i], nums[j], nums[p], nums[q]));
30+
++p;
9531
--q;
32+
} else if (t < target) {
33+
++p;
9634
} else {
97-
q = val > target ? q - 1 : q;
98-
p = val < target ? p + 1 : p;
35+
--q;
9936
}
10037
}
101-
102-
// j < n - 3:保证 j 不会溢出
103-
while (j < n - 3 && nums[j] == nums[j + 1]) {
104-
++j;
105-
}
106-
}
107-
108-
// i < n - 4:保证 i 不会溢出
109-
while (i < n - 4 && nums[i] == nums[i + 1]) {
110-
++i;
11138
}
11239
}
113-
return list;
40+
return res;
11441
}
115-
}
116-
117-
*/
42+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution:
2+
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
3+
res = []
4+
if nums is None or len(nums) < 4:
5+
return res
6+
n = len(nums)
7+
nums.sort()
8+
for i in range(n - 3):
9+
if i > 0 and nums[i] == nums[i - 1]:
10+
continue
11+
for j in range(i + 1, n - 2):
12+
if j > i + 1 and nums[j] == nums[j - 1]:
13+
continue
14+
p, q = j + 1, n - 1
15+
while p < q:
16+
if p > j + 1 and nums[p] == nums[p - 1]:
17+
p += 1
18+
continue
19+
if q < n - 1 and nums[q] == nums[q + 1]:
20+
q -= 1
21+
continue
22+
t = nums[i] + nums[j] + nums[p] + nums[q]
23+
if t == target:
24+
res.append([nums[i], nums[j], nums[p], nums[q]])
25+
p += 1
26+
q -= 1
27+
elif t < target:
28+
p += 1
29+
else:
30+
q -= 1
31+
return res

0 commit comments

Comments
 (0)