跳到主要内容

16-最接近的三数之和

题目

leetcode 16-最接近的三数之和

写法和 15-三数之和 一样,只是在找到有效组合时,不需要再移动指针了,因为这道题不需要去重,记录最小值即可

/*
* @lc app=leetcode.cn id=16 lang=golang
*
* [16] 最接近的三数之和
*/
import "sort"

// @lc code=start
func threeSumClosest(nums []int, target int) int {
sort.Ints(nums)

var res int
min := math.MaxInt64

for i := 0; i < len(nums); i++ {
if i > 0 && nums[i] == nums[i-1] { // 去重
continue
}

l, r := i+1, len(nums)-1
for l < r {
sum := nums[i] + nums[l] + nums[r]

switch {
case sum > target:
r--
case sum < target:
l++
default: // sum == target
return sum
}

// 更新最小值
if abs(sum-target) < min {
min = abs(sum - target)
res = sum
}
}
}

return res
}

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

// @lc code=end