题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解答
和【题目15.三数之和】不同的是,这道题我们不需要考虑是否结果是否重复,因此我们可以直接计算左边,中,右三个指针代表的数字之和即可。整体包含以下步骤:
将输入数组排序,初始化结果变量res伟为前三个数字之和;
左指针从零开始遍历数组,每当左指针移动到一个位置,初始化中指针和右指针的位置;
计算当前三个指针位置处的数字之和作为当前结果,并与结果变量res比较,看谁更接近目标值target,如果是当前和,那么讲将res更新成当前结果。
比较当前结果和target的大小,如果当前结果更大,则右指针左移一位,否则中指针右移一位;
遍历结束后直接返回当前的最好结果res。
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort() # 排序
res = sum(nums[:3]) # 初始化当前结果
for left in range(len(nums)): # 遍历左指针
middle, right = left+1, len(nums)-1 # 初始化中指针和右指针
while middle < right: # 如果中指针和右指针相遇
cur_sum = nums[left] + nums[middle] + nums[right] # 当前组合的和
if abs(res - target) > abs(cur_sum-target): # 如果当前的结果比之前的记录更加接近target
res = cur_sum # 更新当前结果
elif cur_sum > target: # 如果当前和小于target
right -= 1 # 右指针左移
else: # 如果当前和大于等于target
middle += 1 # 中指针右移
return res
如有疑问或建议,欢迎评论区留言。