题目描述:
给定一个包括 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
解题思路:
了解昨天三数之和的话,这道题应该也会有思路,同样适用双指针解法。
此题的算法思路如下:
- 对数组进行排序(排序是必须的,否则无法判断及指针移动)。
- 初始化返回结果 ans 为 nums[0] + nums[1] + nums[2](初始化为Int的最大值也行,反正都是用于判断跟新)
- 遍历排序后数组,并计算当前指向三数的 sum = nums[i] + nums[l] + nums[r] :
- 若 abs(target-sum) < abs(target-ans) (abs 是求绝对值),表示当前 sum 距离更近,则更新结果 ans = sum
- 若 sum < target ,左指针 L 右移
- 若 sum > target,右指针 R 左移
代码实现
//go func threeSumClosest(nums []int, target int) int { sort.Ints(nums) // 排序 length := len(nums) ans := nums[0] + nums[1] + nums[2] for i := 0; i < length; i++ { l, r := i+1, length-1 for l < r { sum := nums[i] + nums[l] + nums[r] if AbsInt(target-sum) < AbsInt(target-ans) { ans = sum } if sum < target { l++ } else if sum > target { r-- } else { return ans } } } return ans } func AbsInt(x int) int { if x < 0 { return -x } return x }