给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
开心,这题用15题的方法一遍过。
相同点:
1. 排除 len(nums) < 3 的情况
2. 先排序
3. 三指针,两个循环
4. 同样的句子来List去重 while i<j and nums[i] == nums[i-1]: i+=1
不同点:
1. k 这层循环要走完 | 而不是走到nums[k] > 0就停止了
2. 存储答案的是一个List,存储 [差值,答案] | 而不是之前的List Of Lists
3. 迭代的时候不是与0比较,而是与target比较
收获:
温习了双指针,与去重循环 while i<j and nums[i] == nums[i-1]: i+=1
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
if len(nums)<3:
return None
nums.sort()
resAndGap = [0,float('inf')]
k = 0
while k < len(nums):
i,j = k+1,len(nums) -1
while i<j:
s = nums[k] + nums[i] + nums[j]
resAndGap = [s,abs(s-target)] if abs(s-target) < resAndGap[1] else resAndGap
if s == target:
return target
elif s < target:
i += 1
while i<j and nums[i] == nums[i-1] : i += 1
elif s > target:
j-= 1
while i < j and nums[j] == nums[j+1]: j-=1
k += 1
while k < len(nums) and nums[k] == nums[k-1]: k += 1
return resAndGap[0]