代码思路:先排序,后遍历,利用双指针进行比较,重点是通过三数之和缩小最相似数值所在位置
class Solution:
def threeSumClosest(self, nums: List[int], tar: int) -> int:
nums.sort()
n=len(nums)
res=float("inf")
#resFlag=0
for i in range(0,n-2):
if nums[i]+nums[i+1]+nums[i+2]-tar==0:
res=tar
elif nums[i]+nums[i+1]+nums[i+2]-tar>0:
if abs(res-tar)>abs(nums[i]+nums[i+1]+nums[i+2]-tar):
res=nums[i]+nums[i+1]+nums[i+2]
else:
if nums[i]+nums[n-2]+nums[n-1]-tar==0:
#resFlag=1
res=tar
elif nums[i]+nums[n-2]+nums[n-1]-tar<0:
if abs(res-tar)>abs(nums[i]+nums[n-2]+nums[n-1]-tar):
res=nums[i]+nums[n-2]+nums[n-1]
continue
else:
start=i+1
end=n-1
while 1:
flag=0
while nums[i]+nums[start+1]+nums[end]-tar<0:
start+=1
flag+=1
while nums[i]+nums[start]+nums[end-1]-tar>0:
end-=1
flag+=1
if flag==0:break
for j in range(start,end):
for k in range(start,end+1):
if abs(res-tar)>abs(nums[i]+nums[j]+nums[k]-tar):
res=nums[i]+nums[j]+nums[k]
return res