LeetCode 16 最接近的三数之和

题目:

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

解题:

又是双指针,我还没学会

代码:

func threeSumClosest(nums []int, target int) int {
    sum, tmp := nums[0]+nums[1]+nums[2], 0
    diff, tmpDiff := math.Abs(float64(sum-target)), 0.0
    //sort.Ints(nums)
    l := len(nums)
    for i := 0; i < l; i++ {
        for j := i + 1; j < l; j++ {
            for k := j + 1; k < l; k++ {
                tmp = nums[i] + nums[j] + nums[k]
                tmpDiff = math.Abs(float64(tmp - target))
                if tmpDiff < diff {
                    sum = tmp
                    diff = tmpDiff
                }
            }
        }
    }
    return sum
}

官方解答:排序+双指针

func threeSumClosest(nums []int, target int) int {
    sort.Ints(nums)
    l := len(nums)
    best := math.MaxInt32
    for i := 0; i < l; i++ {
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        j, k := i+1, l-1
        for j < k {
            sum := nums[i] + nums[j] + nums[k]
            if sum == target {
                return target
            }
            if abs(sum-target) < abs(best-target) {
                best = sum
            }
            if sum > target {
                k0 := k - 1
                for j < k0 && nums[k0] == nums[k] {
                    k0--
                }
                k = k0
            } else {
                j0 := j + 1
                for j0 < k && nums[j0] == nums[j] {
                    j0++
                }
                j = j0
            }
        }


    }
    return best
}


func abs(x int) int {
    if x < 0 {
        return -1 * x
    }
    return x
}

best初始化为math.MaxInt时会溢出

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注