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

题目:

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

返回这三个数的和。

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

分析:

先排序,然后双指针。

// date 2023/12/08
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--
                for l < r && nums[r] == nums[r-1] {
                    r--
                }
            } else {
                l++
                for l < r && nums[l] == nums[l+1] {
                    l++
                }
            }
        }
    }


    return ans
}

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

最后更新于