今天又刷了一道题,分享下解题思路,顺便多做几遍加强印象。
1,思路和三数之和相近,固定一个数后双指针根据与target距离移动
2,先把第一个数出现的重复值的情况跳过
3,判断移动后的和与移动前的和哪个与target更近,取更近的数
4,如果出现和与target相等的情况就直接返回target
5,在没有找到准确答案前,根据规则移动两个指针
注意点:
res初始取值不能是固定值,比如0,
要考虑res与数列nums的距离,当res是nums里的任意三个数的和就不会距离太远,就不会造成res与target距离的误判
from typing import List
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
# print(nums)
n = len(nums)
res = nums[0] + nums[1] + nums[2]
for i in range(n - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
j, k = i + 1, n - 1
while j < k:
num = nums[i] + nums[j] + nums[k]
if abs(num - target) < abs(res - target):
res = num
if num - target == 0:
return target
if num > target:
k -= 1
else:
j += 1
return res
if __name__ == '__main__':
nums = [-1, 2, 1, -4]
res = Solution().threeSumClosest(nums=nums, target=1)
print(res)