
代码:
- abs 求绝对值的函数
- update 根据绝对值更新答案
- 排序之后,枚举a,双指针b,c
- 这样将时间复杂度由直接暴力的N三次方,变为了N平方
func threeSumClosest(nums []int, target int) int {
sort.Ints(nums)
var (
n = len(nums)
best = math.MaxInt32
)
update := func(cur int) {
if abs(cur - target) < abs(best - target) {
best = cur
}
}
for i := 0; i < n; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
j, k := i + 1, n - 1
for j < k {
sum := nums[i] + nums[j] + nums[k]
if sum == target {
return target
}
update(sum)
if sum > target {
k--
} else {
j++
}
}
}
return best
}
func abs(x int) int {
if x < 0 {
return -1 * x
}
return x
}