题目链接
题目描述
题解
题解一(Go)
作者:@仲景
就是和三数之和差不多思路,官方题解是有去重的,但是我觉得不去并不会影响什么,所以就没有去
func threeSumClosest(nums []int, target int) int {
/*
和三数之和差不多吧,排序数组,选定一个目标值,然后双指针遍历其他元素,对双指针进行移动
因为题目给出假设只有一个解,所以求出每次目标值的能组成最接近target的值之后取最小的一个就可以
*/
len := len(nums)
// 给数组排序
sort.Ints(nums)
res, min := 0, math.MaxInt32
for i := 0; i < len-2; i++ {
for left, right := i+1, len-1; left < right; {
// 当前3个数加起来的和
sum := nums[i] + nums[left] + nums[right]
// 如果当前加起来的和与target的差值小于之前的最小差值,最小差值就应该是当前的和与target的差值
// res其实是一个跟踪变量,记录的是上一次最小时候sum的值,
// 这样循环结束之后,如果没有相等的情况,res就可以用来返回
if abs(sum-target) < min {
res, min = sum, abs(sum-target)
}
if sum > target {
right--
} else if sum < target {
left++
} else {
return sum
}
}
}
return res
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}