三数之和。这道题要在 两数之和扩展题 的基础上实现(已提交通过)。
import "sort"
// 找三个数。
func threeSum(nums []int) [][]int {
length := len(nums)
if length < 3 {
return nil
}
sort.Sort(sort.IntSlice(nums)) // 排序
var res [][]int
r := length-1
for i := 0; i < length; {
n := nums[i]
res = twoSum(nums, i+1, r, -n, n, res)
for i < length && nums[i] == n { // 去重
i++
}
}
return res
}
// 找两个数。
// 在nums的索引区间[l,r]找和为target的两个数
func twoSum(nums []int, l, r, target, first int, res [][]int) [][]int {
for l < r {
lv := nums[l]
rv := nums[r]
sum := lv + rv
if sum == target {
res = append(res, []int{first, lv, rv})
}
if sum <= target {
for l < r && nums[l] == lv { // 去重
l++
}
}
if sum >= target {
for l < r && nums[r] == rv { // 去重
r--
}
}
}
return res
}
原题是找到和为0的三元组,可以稍做扩展:找到和为指定target值的三个数。即实现函数func threeSum(nums []int, target int) [][]int。读者可自行实现。