三数之和
https://leetcode-cn.com/problems/3sum/
排序 + 双指针
首先要求 a b c 都不能重复,为了方便处理,可以先将数组排序,然后从小到大开始选 a b c,这样只要在选的时候不选重复的值,就能保证最终的序列也不重复。
假定先选定一个 a,此时目标变为选择一个 b 跟 c 使得 a b c 加起来是 0。由于 a 已经固定了,只要选择一个 b,c 的值也相应地确定了,且随着 b 增大,c 的取值只可能会减小,因此可以使用双指针一左一右来找出,减少一层循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| func threeSum(nums []int) [][]int { sort.Ints(nums) n := len(nums) res := make([][]int, 0)
for first := 0; first < n - 2; first++ { if first > 0 && nums[first] == nums[first-1] { continue }
third := n - 1
for second := first + 1; second < n - 1; second++ { if second - 1 > first && nums[second] == nums[second-1] { continue }
for second < third && nums[first] + nums[second] + nums[third] > 0 { third-- }
if second == third { break }
if nums[first] + nums[second] + nums[third] == 0 { res = append(res, []int{nums[first], nums[second], nums[third]}) } } }
return res }
|