题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
思路
- 可以先固定一个数字,然后一定程度的遍历得到结果
- 暴力遍历肯定能解决,也肯定会超时
- 不暴力的话,排序是个不错的想法,把数据排序好了之后,先确定一个数字人,然后两个指针,分别从最大最小的开始向中间收敛。
收敛的规则是:
如果得到的三数之和sum > target,表示这个数据偏大,适当的缩小可能会更接近结果,所以需要将右边的指针向中间移动,减小sum
如果得到的三数之和sum < target,表示这个数据偏小,适当的增加会更接近结果,所以需要将左边的指针向中间移动,增大sum。
如果两个指针重叠,遍历结束。
代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums = sorted(nums)
cloest = nums[0] + nums[1] + nums[2]
for i in range(len(nums) - 2):
l = i + 1
r = len(nums) - 1
while l < r:
threeSum = nums[i] + nums[l] + nums[r]
if abs(threeSum - target) < abs(cloest - target):
cloest = threeSum
if threeSum - target > 0:
r -= 1
elif threeSum - target == 0:
return threeSum
else:
l += 1
return cloest