这道题和三数之和非常相似,稍微修改一下中间的逻辑就可以直接过了。
题目:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。提示:3 <= nums.length <= 10^3-10^3 <= nums[i] <= 10^3-10^4 <= target <= 10^4
思路:
与三数之和一样,先对数组进行排序,接着把三个数中的一个固定,然后双指针移动另外两个数,不断的向target靠近,最后就能得出答案;当然,中间也要考虑去重,这里的去重主要是考虑到执行时间,理论上不进行去重对最终结果也没有影响。
/** @lc app=leetcode.cn id=16 lang=golang** [16] 最接近的三数之和*/// @lc code=startfunc threeSumClosest(nums []int, target int) int {var index intn := len(nums)minDiff := math.MaxInt32quickSort(nums) //先进行排序,固定一个值// fmt.Println(nums)update := func(cur int) {if abs(cur-target) < abs(minDiff-target) {minDiff = cur}}for index = 0; index < n; index++ { //这里要从0开始,与三数之和不同// head, tail := 0, len(nums)-1 //每次都从0到length-1if index > 0 && nums[index] == nums[index-1] {continue}left, right := index+1, n-1for left < right {sum := nums[index] + nums[left] + nums[right]if sum == target {return target}update(sum)if left > index+1 && left < n && nums[left] == nums[left-1] {left++continue}if right < n-1 && right > left && nums[right] == nums[right+1] {right--continue}if sum > target {right--} else {left++}}}return minDiff}func quickSort(nums []int) {if len(nums) < 2 {return}head, tail := 0, len(nums)-1reference := nums[0]i := 1for head < tail {if nums[i] < reference {nums[i], nums[head] = nums[head], nums[i]i++head++} else {nums[i], nums[tail] = nums[tail], nums[i]tail--}}quickSort(nums[:head])quickSort(nums[head+1:])}func abs(x int) int {switch {case x == 0:return 0case x < 0:return -1 * x}return x}// @lc code=end
