【LeetCode笔记】16. 最接近的三数之和(中等)

190 阅读1分钟

16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。

示例 1:

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

分析: 本题采用暴力解法时间复杂度O(N^3),可以通过O(log2N)的排序算法来降低复杂度,遍历一遍第一个数到第N-2个数字,通过双指针不断比较nums[i]和左右指针之和比target大还是小,不断移动左右指针直至相遇。

代码:

image.png

    sort.Ints(nums)
    if len(nums) == 3 {
        return nums[0]+nums[1]+nums[2]
    }
    var closest int =  nums[0] + nums[1] + nums[2]   
    for i := 0; i < (len(nums)-2); i++ {
        // if i>0 && nums[i] == nums[i-1] {
        //     continue
        // }
        var pc int = len(nums) -1
        var pb int = i+1
        for pc > pb {
            if nums[pb] + nums[pc] + nums[i] == target {
                return target
            }
            if abs(nums[pb] + nums[pc] + nums[i]- target) < abs(closest - target) {
                closest = nums[pb] + nums[pc] + nums[i]
            }
            if (nums[pb] + nums[pc] + nums[i]) < target {
                pb++
            } else if (nums[pb] + nums[pc] + nums[i] > target) {
                pc--
            } 
        }
       
    }
    return closest
}

func abs(n int) int {
    if n > 0 {
      return n
    }
    return -n
}