leetcode 18. 四数之和

120 阅读1分钟

力扣题目链接

四数之和,基于三数之和实现(已提交通过)。

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
}