vault backup: 2026-03-05 12:28:58
This commit is contained in:
@@ -57,123 +57,7 @@ nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0
|
||||
|
||||
---
|
||||
|
||||
## Go 解法
|
||||
|
||||
```go
|
||||
func threeSum(nums []int) [][]int {
|
||||
result := [][]int{}
|
||||
n := len(nums)
|
||||
|
||||
// 排序
|
||||
sort.Ints(nums)
|
||||
|
||||
for i := 0; i < n-2; i++ {
|
||||
// 去重:跳过重复的第一个数
|
||||
if i > 0 && nums[i] == nums[i-1] {
|
||||
continue
|
||||
}
|
||||
|
||||
// 优化:如果最小数 > 0,后面不可能有解
|
||||
if nums[i] > 0 {
|
||||
break
|
||||
}
|
||||
|
||||
// 双指针
|
||||
left, right := i+1, n-1
|
||||
for left < right {
|
||||
sum := nums[i] + nums[left] + nums[right]
|
||||
|
||||
if sum == 0 {
|
||||
result = append(result, []int{nums[i], nums[left], nums[right]})
|
||||
|
||||
// 去重:跳过重复的 left
|
||||
for left < right && nums[left] == nums[left+1] {
|
||||
left++
|
||||
}
|
||||
// 去重:跳过重复的 right
|
||||
for left < right && nums[right] == nums[right-1] {
|
||||
right--
|
||||
}
|
||||
|
||||
// 移动指针
|
||||
left++
|
||||
right--
|
||||
} else if sum < 0 {
|
||||
// 和太小,left 向右移
|
||||
left++
|
||||
} else {
|
||||
// 和太大,right 向左移
|
||||
right--
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
```
|
||||
|
||||
### Go 代码要点
|
||||
1. `sort.Ints()` 排序
|
||||
2. `append()` 添加结果
|
||||
3. 多重去重逻辑
|
||||
|
||||
---
|
||||
|
||||
## Java 解法
|
||||
|
||||
```java
|
||||
class Solution {
|
||||
public List<List<Integer>> threeSum(int[] nums) {
|
||||
List<List<Integer>> result = new ArrayList<>();
|
||||
Arrays.sort(nums);
|
||||
|
||||
for (int i = 0; i < nums.length - 2; i++) {
|
||||
// 去重:跳过重复的第一个数
|
||||
if (i > 0 && nums[i] == nums[i - 1]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 优化:如果最小数 > 0,后面不可能有解
|
||||
if (nums[i] > 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// 双指针
|
||||
int left = i + 1, right = nums.length - 1;
|
||||
while (left < right) {
|
||||
int sum = nums[i] + nums[left] + nums[right];
|
||||
|
||||
if (sum == 0) {
|
||||
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
|
||||
|
||||
// 去重:跳过重复的 left
|
||||
while (left < right && nums[left] == nums[left + 1]) {
|
||||
left++;
|
||||
}
|
||||
// 去重:跳过重复的 right
|
||||
while (left < right && nums[right] == nums[right - 1]) {
|
||||
right--;
|
||||
}
|
||||
|
||||
left++;
|
||||
right--;
|
||||
} else if (sum < 0) {
|
||||
left++;
|
||||
} else {
|
||||
right--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Java 代码要点
|
||||
1. `Arrays.sort()` 排序
|
||||
2. `Arrays.asList()` 创建列表
|
||||
3. `ArrayList` 存储结果
|
||||
## 解法
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user