Leecode第16题
思路:用一个res记录当前最接近的和,在每一次循环的时候,做一个优化:当前值为nums【i】的时候,最大的数是nums【i】+nums【right】+nums【right-1】,如果最大的数都小于,则直接比较并退出;若最小数(nums【i】+nums【left】+nums【left+1】)都大于目标值,则直接比较并退出。其他部分和双指针求三数和一样啦。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
res = nums[0] + nums[1] + nums[2]
len_num = len(nums)
for i in range(len_num-2):
left = i + 1
right = len_num - 1
while left != right:
#判断最小值:如果最大的都小,跳出循环
mn=nums[i]+nums[left]+nums[left+1]
if target<mn:
if abs(mn-target)<abs(res-target):
res=mn;
break
mx=nums[i]+nums[right]+nums[right-1]
if target>mx:
if abs(mx-target)<abs(res-target):
res=mx
break
sums = nums[i] + nums[left] + nums[right]
if sums == target: return sums
if abs(sums-target) < abs(res-target):
res = sums
if sums > target:
right=right-1
else:
left=left+1
return res