用 Golang 实现给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
package main
import (
"fmt"
"sort"
)
// 暴力解法
func threeSumClosest1(nums []int, target int) int {
closeNum, flag := close(target, nums[0]+nums[1]+nums[2])
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
for k := j + 1; k < len(nums); k++ {
temp, sign := close(target, nums[i]+nums[j]+nums[k])
if temp < closeNum {
closeNum = temp
flag = sign
}
}
}
}
return target - flag*closeNum
}
func close(num1, num2 int) (int, int) {
if num1 > num2 {
return num1 - num2, 1
} else {
return num2 - num1, -1
}
}
// 排序双指针
func threeSumClosest(nums []int, target int) int {
minDistance := int(^uint(0) >> 1)
closedSum := 0
sort.Ints(nums)
for i := 0; i < len(nums)-2; i++ {
if i != 0 && nums[i-1] == nums[i] {
continue
}
l := i + 1
r := len(nums) - 1
for l < r {
fmt.Println(i, l, r)
sum := nums[i] + nums[l] + nums[r]
d := target - sum
if d < 0 {
r--
} else if d > 0 {
l++
} else {
return target
}
if d < 0 {
d = -d
}
if d < minDistance {
minDistance = d
closedSum = sum
}
}
}
return closedSum
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
nums := []int{-1, 2, 1, -4}
fmt.Println(threeSumClosest(nums, 1))
}
程序运行后,控制台输出如下:
我们输入了测试用例,输出了正确结果。