LeetCode15. 三数之和Golang版
1. 问题描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
2. 思路
双指针法。
算法流程:
- 特判:对于数组长度n,如果小于3,返回[]
- 对数组进行排序
- 遍历排序后的数组
- 若nums[i] > 0:由于已经排好序,后面的a+b+c一定不等于0,直接返回res。(优化点,这一步可有可无。)
- 对于重复的元素,跳过。
- 令左指针
l
=
i
−
1
l = i - 1
l=i−1,右指针
r
=
n
−
1
r = n - 1
r=n−1,当
l
<
r
l < r
l<r 时,循环执行
- 当 n u m s [ i ] + n u m s [ l ] + n u m s [ r ] = = 0 nums[i] + nums[l] + nums[r] == 0 nums[i]+nums[l]+nums[r]==0,收集结果。判断左界和右界是否和下一位重复,去除重复解。同时,将 l , r l, r l,r移动到下一位置,寻找新的解。
- 如果和大于0, r r r 左移
- 如果和小于0, l l l右移
3. 代码
func threeSum(nums []int) [][]int {
var res [][]int
if len(nums) < 3 {
return res
}
sort.Ints(nums)
for i := 0; i < len(nums); i++ {
if nums[i] > 0{
return res
}
if i > 0 && nums[i] == nums[i-1] {
continue
}
l, r := i + 1, len(nums) - 1
for l < r {
sum := nums[i] + nums[l] + nums[r]
if sum == 0 {
temp := []int{nums[i], nums[l], nums[r]}
res = append(res, temp)
for l < r && nums[l] == nums[l+1] {
l++
}
for l < r && nums[r] == nums[r-1] {
r--
}
l++
r--
} else if sum < 0 {
l++
} else {
r--
}
}
}
return res
}