题目:
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
解题:
又是双指针,我还没学会
代码:
func threeSumClosest(nums []int, target int) int {
sum, tmp := nums[0]+nums[1]+nums[2], 0
diff, tmpDiff := math.Abs(float64(sum-target)), 0.0
//sort.Ints(nums)
l := len(nums)
for i := 0; i < l; i++ {
for j := i + 1; j < l; j++ {
for k := j + 1; k < l; k++ {
tmp = nums[i] + nums[j] + nums[k]
tmpDiff = math.Abs(float64(tmp - target))
if tmpDiff < diff {
sum = tmp
diff = tmpDiff
}
}
}
}
return sum
}
官方解答:排序+双指针
func threeSumClosest(nums []int, target int) int {
sort.Ints(nums)
l := len(nums)
best := math.MaxInt32
for i := 0; i < l; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
j, k := i+1, l-1
for j < k {
sum := nums[i] + nums[j] + nums[k]
if sum == target {
return target
}
if abs(sum-target) < abs(best-target) {
best = sum
}
if sum > target {
k0 := k - 1
for j < k0 && nums[k0] == nums[k] {
k0--
}
k = k0
} else {
j0 := j + 1
for j0 < k && nums[j0] == nums[j] {
j0++
}
j = j0
}
}
}
return best
}
func abs(x int) int {
if x < 0 {
return -1 * x
}
return x
}
best初始化为math.MaxInt时会溢出