Skip to content

Commit bd7e68a

Browse files
committed
feat: add solutions to lcof2 problem: No.007
1 parent 5cc544e commit bd7e68a

File tree

4 files changed

+174
-1
lines changed

4 files changed

+174
-1
lines changed

lcof2/剑指 Offer II 007. 数组中和为 0 的三个数/README.md

+90-1
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,111 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
枚举第一个数,然后用双指针确定另外两个数
51+
5052
<!-- tabs:start -->
5153

5254
### **Python3**
5355

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

5658
```python
57-
59+
class Solution:
60+
def threeSum(self, nums: List[int]) -> List[List[int]]:
61+
n, ans = len(nums), []
62+
nums.sort()
63+
for i in range(n - 2):
64+
if i > 0 and nums[i] == nums[i - 1]: continue
65+
left, right = i + 1, n - 1
66+
while left < right:
67+
cur = nums[i] + nums[left] + nums[right]
68+
if cur < 0:
69+
left += 1
70+
elif cur > 0:
71+
right -= 1
72+
else:
73+
ans.append([nums[i], nums[left], nums[right]])
74+
while left < right and nums[left] == nums[left + 1]:
75+
left += 1
76+
while left < right and nums[right] == nums[right - 1]:
77+
right -= 1
78+
left += 1
79+
right -= 1
80+
return ans
5881
```
5982

6083
### **Java**
6184

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

6487
```java
88+
class Solution {
89+
public List<List<Integer>> threeSum(int[] nums) {
90+
int n = nums.length;
91+
List<List<Integer>> ans = new ArrayList<>();
92+
Arrays.sort(nums);
93+
for (int i = 0; i < n - 2; i++) {
94+
if (i > 0 && nums[i] == nums[i - 1]) {
95+
continue;
96+
}
97+
int left = i + 1, right = n - 1;
98+
while (left < right) {
99+
int cur = nums[i] + nums[left] + nums[right];
100+
if (cur < 0) {
101+
left++;
102+
} else if (cur > 0) {
103+
right--;
104+
} else {
105+
ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
106+
while (left < right && nums[left] == nums[left + 1]) {
107+
left++;
108+
}
109+
while (left < right && nums[right] == nums[right - 1]) {
110+
right--;
111+
}
112+
left++;
113+
right--;
114+
}
115+
}
116+
}
117+
return ans;
118+
}
119+
}
120+
```
65121

122+
### **Go**
123+
124+
```go
125+
func threeSum(nums []int) [][]int {
126+
n := len(nums)
127+
ans := make([][]int, 0)
128+
sort.Ints(nums)
129+
for i := 0; i < n-2 && nums[i] <= 0; i++ {
130+
left, right := i+1, n-1
131+
for left < right {
132+
cur := nums[i] + nums[left] + nums[right]
133+
if cur < 0 {
134+
left++
135+
} else if cur > 0 {
136+
right--
137+
} else {
138+
ans = append(ans, []int{nums[i], nums[left], nums[right]})
139+
for left < right && nums[left] == nums[left+1] {
140+
left++
141+
}
142+
for left < right && nums[right] == nums[right-1] {
143+
right--
144+
}
145+
left++
146+
right--
147+
}
148+
}
149+
for i < n-2 && nums[i] == nums[i+1] {
150+
i++
151+
}
152+
}
153+
return ans
154+
}
66155
```
67156

68157
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func threeSum(nums []int) [][]int {
2+
n := len(nums)
3+
ans := make([][]int, 0)
4+
sort.Ints(nums)
5+
for i := 0; i < n-2 && nums[i] <= 0; i++ {
6+
left, right := i+1, n-1
7+
for left < right {
8+
cur := nums[i] + nums[left] + nums[right]
9+
if cur < 0 {
10+
left++
11+
} else if cur > 0 {
12+
right--
13+
} else {
14+
ans = append(ans, []int{nums[i], nums[left], nums[right]})
15+
for left < right && nums[left] == nums[left+1] {
16+
left++
17+
}
18+
for left < right && nums[right] == nums[right-1] {
19+
right--
20+
}
21+
left++
22+
right--
23+
}
24+
}
25+
for i < n-2 && nums[i] == nums[i+1] {
26+
i++
27+
}
28+
}
29+
return ans
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
public List<List<Integer>> threeSum(int[] nums) {
3+
int n = nums.length;
4+
List<List<Integer>> ans = new ArrayList<>();
5+
Arrays.sort(nums);
6+
for (int i = 0; i < n - 2; i++) {
7+
if (i > 0 && nums[i] == nums[i - 1]) {
8+
continue;
9+
}
10+
int left = i + 1, right = n - 1;
11+
while (left < right) {
12+
int cur = nums[i] + nums[left] + nums[right];
13+
if (cur < 0) {
14+
left++;
15+
} else if (cur > 0) {
16+
right--;
17+
} else {
18+
ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
19+
while (left < right && nums[left] == nums[left + 1]) {
20+
left++;
21+
}
22+
while (left < right && nums[right] == nums[right - 1]) {
23+
right--;
24+
}
25+
left++;
26+
right--;
27+
}
28+
}
29+
}
30+
return ans;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution:
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
n, ans = len(nums), []
4+
nums.sort()
5+
for i in range(n - 2):
6+
if i > 0 and nums[i] == nums[i - 1]: continue
7+
left, right = i + 1, n - 1
8+
while left < right:
9+
cur = nums[i] + nums[left] + nums[right]
10+
if cur < 0:
11+
left += 1
12+
elif cur > 0:
13+
right -= 1
14+
else:
15+
ans.append([nums[i], nums[left], nums[right]])
16+
while left < right and nums[left] == nums[left + 1]:
17+
left += 1
18+
while left < right and nums[right] == nums[right - 1]:
19+
right -= 1
20+
left += 1
21+
right -= 1
22+
return ans

0 commit comments

Comments
 (0)