|
@@ -0,0 +1,55 @@
|
|
|
|
+package main
|
|
|
|
+
|
|
|
|
+// 排序+双指针法
|
|
|
|
+import (
|
|
|
|
+ "fmt"
|
|
|
|
+ "sort"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func main() {
|
|
|
|
+ var nums []int
|
|
|
|
+
|
|
|
|
+ nums = []int{-1, 0, 1, 2, -1, -4}
|
|
|
|
+ fmt.Println(threeSum(nums))
|
|
|
|
+
|
|
|
|
+ nums = []int{3, 0, -2, -1, 1, 2}
|
|
|
|
+ fmt.Println(threeSum(nums))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func threeSum(nums []int) [][]int {
|
|
|
|
+ var ret = [][]int{}
|
|
|
|
+ sort.Ints(nums)
|
|
|
|
+ for i := 0; i < len(nums); i++ {
|
|
|
|
+ if i > 0 && nums[i] == nums[i-1] {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+ var j, k = i + 1, len(nums) - 1
|
|
|
|
+ for j < k {
|
|
|
|
+ var num = nums[i] + nums[j] + nums[k]
|
|
|
|
+ if num == 0 {
|
|
|
|
+ ret = append(ret, []int{nums[i], nums[j], nums[k]})
|
|
|
|
+ for j < k {
|
|
|
|
+ j++
|
|
|
|
+ if nums[j] != nums[j-1] {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for k > j {
|
|
|
|
+ k--
|
|
|
|
+ if nums[k] != nums[k+1] {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if num > 0 {
|
|
|
|
+ k--
|
|
|
|
+ }
|
|
|
|
+ if num < 0 {
|
|
|
|
+ j++
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return ret
|
|
|
|
+}
|