Golang最接近三数之和

题目

Golang 实现给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例1

例如,给定数组 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)) }

程序运行后,控制台输出如下:

17_golang最接近三数之和.png

我们输入了测试用例,输出了正确结果。