update 0015.三数之和:完善注释,优化go代码风格

This commit is contained in:
Yuhao Ju
2022-11-24 22:05:59 +08:00
committed by GitHub
parent 983bb606d3
commit dddbb95ea7

View File

@ -253,13 +253,15 @@ class Solution {
public List<List<Integer>> threeSum(int[] nums) { public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>(); List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums); Arrays.sort(nums);
// 找出a + b + c = 0
// a = nums[i], b = nums[left], c = nums[right]
for (int i = 0; i < nums.length; i++) { for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) { // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if (nums[i] > 0) {
return result; return result;
} }
if (i > 0 && nums[i] == nums[i - 1]) { if (i > 0 && nums[i] == nums[i - 1]) { // 去重a
continue; continue;
} }
@ -273,7 +275,7 @@ class Solution {
left++; left++;
} else { } else {
result.add(Arrays.asList(nums[i], nums[left], nums[right])); result.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 去重逻辑应该放在找到一个三元组之后对b 和 c去重
while (right > left && nums[right] == nums[right - 1]) right--; while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++; while (right > left && nums[left] == nums[left + 1]) left++;
@ -294,12 +296,15 @@ class Solution:
ans = [] ans = []
n = len(nums) n = len(nums)
nums.sort() nums.sort()
# 找出a + b + c = 0
# a = nums[i], b = nums[left], c = nums[right]
for i in range(n): for i in range(n):
left = i + 1 left = i + 1
right = n - 1 right = n - 1
if nums[i] > 0: # 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if nums[i] > 0:
break break
if i >= 1 and nums[i] == nums[i - 1]: if i >= 1 and nums[i] == nums[i - 1]: # 去重a
continue continue
while left < right: while left < right:
total = nums[i] + nums[left] + nums[right] total = nums[i] + nums[left] + nums[right]
@ -309,13 +314,14 @@ class Solution:
left += 1 left += 1
else: else:
ans.append([nums[i], nums[left], nums[right]]) ans.append([nums[i], nums[left], nums[right]])
# 去重逻辑应该放在找到一个三元组之后对b 和 c去重
while left != right and nums[left] == nums[left + 1]: left += 1 while left != right and nums[left] == nums[left + 1]: left += 1
while left != right and nums[right] == nums[right - 1]: right -= 1 while left != right and nums[right] == nums[right - 1]: right -= 1
left += 1 left += 1
right -= 1 right -= 1
return ans return ans
``` ```
Python (v2): Python (v3):
```python ```python
class Solution: class Solution:
@ -344,32 +350,36 @@ class Solution:
Go Go
```Go ```Go
func threeSum(nums []int)[][]int{ func threeSum(nums []int) [][]int {
sort.Ints(nums) sort.Ints(nums)
res:=[][]int{} res := [][]int{}
// 找出a + b + c = 0
for i:=0;i<len(nums)-2;i++{ // a = nums[i], b = nums[left], c = nums[right]
n1:=nums[i] for i := 0; i < len(nums)-2; i++ {
if n1>0{ // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
n1 := nums[i]
if n1 > 0 {
break break
} }
if i>0&&n1==nums[i-1]{ // 去重a
if i > 0 && n1 == nums[i-1] {
continue continue
} }
l,r:=i+1,len(nums)-1 l, r := i+1, len(nums)-1
for l<r{ for l < r {
n2,n3:=nums[l],nums[r] n2, n3 := nums[l], nums[r]
if n1+n2+n3==0{ if n1+n2+n3 == 0 {
res=append(res,[]int{n1,n2,n3}) res = append(res, []int{n1, n2, n3})
for l<r&&nums[l]==n2{ // 去重逻辑应该放在找到一个三元组之后对b 和 c去重
for l < r && nums[l] == n2 {
l++ l++
} }
for l<r&&nums[r]==n3{ for l < r && nums[r] == n3 {
r-- r--
} }
}else if n1+n2+n3<0{ } else if n1+n2+n3 < 0 {
l++ l++
}else { } else {
r-- r--
} }
} }