https://leetcode.com/problems/3sum-closest/#/description
class Solution(object):
def match(self, nums, ind0, target, res):
ind1=ind0+1
ind2=len(nums)-1
minv=abs(target-res)
while ind1<len(nums)-1 and ind2>ind1:
if nums[ind1]+nums[ind2]>target-nums[ind0]:
if nums[ind1]+nums[ind2]+nums[ind0]-target<minv:
res = nums[ind1]+nums[ind2]+nums[ind0]
minv=res-target
while ind1<ind2-1 and nums[ind2]==nums[ind2-1]: ind2-=1
ind2-=1
else:
if nums[ind1]+nums[ind2]==target-nums[ind0]:
return target
else:
if target-nums[ind1]-nums[ind2]-nums[ind0]<minv:
res = nums[ind1]+nums[ind2]+nums[ind0]
minv=target-res
while ind1<len(nums)-1 and nums[ind1]==nums[ind1+1]: ind1+=1
ind1+=1
return res
def threeSumClosest(self, nums, target):
if len(nums)<3: return 0
nums.sort()
ind0=0
res = nums[0]+nums[1]+nums[2]
while ind0<len(nums)-2:
res = self.match(nums, ind0, target, res)
if res==target: return target
while ind0<len(nums)-1 and nums[ind0]==nums[ind0+1]: ind0+=1
ind0+=1
return res