========坚持30天刷leetcode=====
题目链接:https://leetcode-cn.com/problems/3sum-closest/
先上结果:
分析:关键在于特殊情况的判断,减少遍历。
class Solution:
def threeSumClosest(self, nums, target):
k=len(nums)
if k<3: return None # 特殊情况: 数组小于3
if k==3: return sum(nums) # 特殊情况: 数组等于3
nums.sort()
if nums[0]+nums[1]+nums[2] >= target: # 特殊情况: 最小3个数和 大于等于target
return nums[0]+nums[1]+nums[2]
if nums[k-3]+nums[k-2]+nums[k-1]<=target: # 特殊情况: 最大3个数和 小于等于target
return nums[k-3]+nums[k-2]+nums[k-1]
result=0 # 标记变量
min_gap=float("inf")
for a in range(k-2): # 遍历数组:从第一个数->倒数第三个数
b=a+1 # 移动变量
c=k-1
if nums[a]+nums[b]+nums[b+1] > target: # 特殊:当前数+最小的2个数 > target
csum=nums[a]+nums[b]+nums[b+1]
gap=abs(target-csum)
if gap
< target
csum=nums[a]+nums[c-1]+nums[c]
gap=abs(target-csum)
if gap
< c and nums[b-1] == nums[b]: b+= 1 # 特殊:数组内存在相同的数
else:
c-=1
while b < c and nums[c] == nums[c+1]: c-= 1 # 特殊:数组内存在相同的数
return result