12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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++
- }
- // 添加了这里的优化,反而时间多了一点,但是内存少了许多
- //if num > 0 {
- // for k > j {
- // k--
- // if nums[k] != nums[k+1] {
- // break
- // }
- // }
- //}
- //if num < 0 {
- // for j < k {
- // j++
- // if nums[j] != nums[j-1] {
- // break
- // }
- // }
- //}
- }
- }
- }
- return ret
- }
|