四数之和,基于三数之和实现(已提交通过)。
import "sort"
// 找四个数。
func fourSum(nums []int, target int) [][]int {
length := len(nums)
if length < 4 {
return nil
}
sort.Sort(sort.IntSlice(nums)) // 排序
var res [][]int
r := length-1
for i := 0; i < length; {
n := nums[i]
res = threeSum(nums, i+1, r, target-n, n, res)
for i < length && nums[i] == n { // 去重
i++
}
}
return res
}
// 找三个数。
// 找nums的索引区间[left,right]里的和为target的三个数
// first: 四数中的第一个
func threeSum(nums []int, left, right, target, first int, res [][]int) [][]int {
for i := left; i <= right; {
n := nums[i] // 四数中的第二个
res = twoSum(nums, i+1, right, target-n, first, n, res)
for i <= right && nums[i] == n { // 去重
i++
}
}
return res
}
// 找两个数。
// 找nums的索引区间[l,r]里和为t的两个数
// second:四个数中的第二个
func twoSum(nums []int, l, r, t, first, second int, res [][]int) [][]int {
for l < r {
lv := nums[l]
rv := nums[r]
sum := lv+rv
if sum == t {
res = append(res, []int{first, second, lv, rv})
}
if sum <= t {
for l < r && nums[l] == lv { // 去重
l++
}
}
if sum >= t {
for l < r && nums[r] == rv { // 去重
r--
}
}
}
return res
}