16 最接近的三数之和-中等

题目:

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

返回这三个数的和。

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

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入:nums = [0,0,0], target = 1
输出:0

解题思路

这道题可用双指针解决。思路是先排序,然后对撞指针找最接近的答案。

// date 2024/01/15
func threeSumClosest(nums []int, target int) int {
    // sort and left, right
    sort.Slice(nums, func(i, j int) bool {
        return nums[i] < nums[j]
    })

    ans := math.MaxInt32
    n := len(nums)
    for i := 0; i < n; i++ {
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        l, r := i+1, n-1
        for l < r {
            sum := nums[i] + nums[l] + nums[r]
            if sum == target {
                return sum
            }
            // update the ans
            if abs(ans, target) > abs(sum, target) {
                ans = sum
            }
            if sum > target {
                r--
            } else {
                l++
            }
        }
    }


    return ans
}

func abs(x, y int) int {
    if x > y {
        return x-y
    }
    return y-x
}

最后更新于