93 lines
1.9 KiB
Go
93 lines
1.9 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"sort"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
fmt.Println(threeSum([]int{1, -1, -1, 0}))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func threeSum(nums []int) [][]int {
|
|||
|
|
result := make([][]int, 0)
|
|||
|
|
sort.Ints(nums)
|
|||
|
|
|
|||
|
|
for i := 0; i < len(nums); i++ {
|
|||
|
|
if i-1 >= 0 {
|
|||
|
|
if nums[i] == nums[i-1] {
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
left, right := i+1, len(nums)-1
|
|||
|
|
for left < right {
|
|||
|
|
num := nums[left] + nums[right]
|
|||
|
|
if num == -nums[i] {
|
|||
|
|
value := make([]int, 0)
|
|||
|
|
value = append(value, nums[left], nums[right], nums[i])
|
|||
|
|
result = append(result, value)
|
|||
|
|
left++
|
|||
|
|
right--
|
|||
|
|
if left-1 > 0 {
|
|||
|
|
for nums[left] == nums[left-1] && left < right {
|
|||
|
|
left++
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if right+1 < len(nums) {
|
|||
|
|
for nums[right] == nums[right+1] && left < right {
|
|||
|
|
right--
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} else if num < -nums[i] {
|
|||
|
|
left++
|
|||
|
|
} else if num >= -nums[i] {
|
|||
|
|
right--
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return result
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//func threeSum(nums []int) [][]int {
|
|||
|
|
// result := make([][]int, 0)
|
|||
|
|
// hash := make(map[int][]int)
|
|||
|
|
// result2 := make(map[[3]int]struct{}, 0)
|
|||
|
|
// right := len(nums) - 1
|
|||
|
|
// for i := 0; i < right+1; i++ {
|
|||
|
|
// hash[nums[i]] = append(hash[nums[i]], i)
|
|||
|
|
// }
|
|||
|
|
// fmt.Println(hash)
|
|||
|
|
// for left := 0; left < len(nums); left++ {
|
|||
|
|
// for right := left + 1; right < len(nums); right++ {
|
|||
|
|
// sum := nums[left] + nums[right]
|
|||
|
|
// z := -sum
|
|||
|
|
// if value, ok := hash[z]; ok {
|
|||
|
|
// for _, v := range value {
|
|||
|
|
// if v == left || v == right {
|
|||
|
|
// continue
|
|||
|
|
// } else {
|
|||
|
|
// num := [3]int{nums[v], nums[left], nums[right]}
|
|||
|
|
// slice := num[:] // 或直接创建新切片:slice := []int{num[0], num[1], num[2]}
|
|||
|
|
// sort.Ints(slice)
|
|||
|
|
// result2[[3]int(slice)] = struct{}{}
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// } else {
|
|||
|
|
// continue
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// fmt.Println("result2", result2)
|
|||
|
|
// for k, _ := range result2 {
|
|||
|
|
// value := make([]int, 0)
|
|||
|
|
// for _, v := range k {
|
|||
|
|
// value = append(value, v)
|
|||
|
|
// }
|
|||
|
|
// result = append(result, value)
|
|||
|
|
// }
|
|||
|
|
// return result
|
|||
|
|
//}
|