init
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
package top100liked
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// https://leetcode.cn/problems/3sum/?envType=study-plan-v2&envId=top-100-liked
|
||||
|
||||
func threeSum(nums []int) [][]int {
|
||||
sort.Ints(nums)
|
||||
|
||||
n := len(nums)
|
||||
res := make([][]int, 0)
|
||||
|
||||
for i := 0; i < n-2; i++ {
|
||||
// 去重第一个数
|
||||
if i > 0 && nums[i] == nums[i-1] {
|
||||
continue
|
||||
}
|
||||
|
||||
// 剪枝:当前最小三数和已经大于 0
|
||||
if nums[i]+nums[i+1]+nums[i+2] > 0 {
|
||||
break
|
||||
}
|
||||
|
||||
// 剪枝:当前最大三数和仍然小于 0
|
||||
if nums[i]+nums[n-2]+nums[n-1] < 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
target := -nums[i]
|
||||
l, r := i+1, n-1
|
||||
|
||||
for l < r {
|
||||
sum := nums[l] + nums[r]
|
||||
|
||||
if sum == target {
|
||||
res = append(res, []int{nums[i], nums[l], nums[r]})
|
||||
|
||||
leftVal := nums[l]
|
||||
rightVal := nums[r]
|
||||
|
||||
// 命中后,左右都跳过重复值
|
||||
for l < r && nums[l] == leftVal {
|
||||
l++
|
||||
}
|
||||
for l < r && nums[r] == rightVal {
|
||||
r--
|
||||
}
|
||||
} else if sum < target {
|
||||
leftVal := nums[l]
|
||||
|
||||
// 当前 l 太小,且重复的 l 也一样太小,直接跳过
|
||||
for l < r && nums[l] == leftVal {
|
||||
l++
|
||||
}
|
||||
} else {
|
||||
rightVal := nums[r]
|
||||
|
||||
// 当前 r 太大,且重复的 r 也一样太大,直接跳过
|
||||
for l < r && nums[r] == rightVal {
|
||||
r--
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func TestS6(t *testing.T) {
|
||||
nums := []int{-100, -70, -60, 110, 120, 130, 160}
|
||||
fmt.Printf("%+v", threeSum(nums))
|
||||
}
|
||||
Reference in New Issue
Block a user