题目:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
代码:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort() #先将原数组进行排序
res = float("inf") #res先赋值一个正无穷大的数
for k in range(len(nums) - 2): #遍历数组,后面还有i和j指针,因此只用遍历到len(nums) - 2
if k > 0 and nums[k] == nums[k - 1]: continue #如果有重复的数字,则直接跳过,避免重复答案
i, j = k + 1, len(nums) - 1 #双指针法,分别从两侧遍历k后面的数组
while i < j:
tmp = nums[k] + nums[i] + nums[j] #计算三个数的和
if abs(tmp - target) < abs(res - target): res = tmp #判断是否要更新全局结果
if tmp > target: j -= 1 #更新下标,如果当前值比target大,j减小
elif tmp < target: i += 1 #更新下标,如果当前值比target小,i增加
else: return target #当前值等于target,直接返回,这个就是最小值
return res