题目描述;
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题:
class Solution:
def threeSumClosest(self, nums,target):
#如果数组为空或者长度小于3,返回空
if not nums or len(nums) < 3:
return None
#先排序
nums.sort()
#表示res是无穷大
res = float("inf")
#从左往右遍历数组
for i in range(len(nums)):
#对于重复的值,只需要计算一次即可
if i > 0 and nums[i] == nums[i-1]:
continue
#左指针
l = i + 1
#右指针
r = len(nums) - 1
#核心就是不断增大左指针指向的值和缩小右指针指向的值
#使得三个数的和尽量靠近target
while l < r:
# 记录当前三个数的和
cur = nums[i] + nums[l] + nums[r]
#如果找到等于target的三个数,直接返回即可
if cur == target:
return target
if abs(res-target) > abs(cur-target):
#第一次判断时总是成立的,因为此时res是无穷大
res = cur
if cur > target:#当前值太大了,将右指针左移
r -= 1
else: #当前值太小了,将左指针右移
l += 1
return res
其中很关键的一步就是如何确定初始值,即要让res首先是无穷大。
结果: