給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
class Solution:
def threeSumClosest(self, nums, target):
size = len(nums)
# 特判
if size < 3:
return []
# 初始化,因爲找最小值,因此把初始值設置成實數的最大值
diff = float('inf')
# 排序是前提
nums.sort()
for i in range(size - 2):
# 常見的剪枝操作
if i > 0 and nums[i] == nums[i - 1]:
continue
# 雙指針:指針對撞
left = i + 1
right = size - 1
while left < right:
s = nums[i] + nums[left] + nums[right]
if abs(s - target) < diff:
diff = abs(s - target)
res = s
# 不管是變小還是變大,嘗試的作用是讓 s 與 target 更接近
# 即 s 與 target 的絕對值之差越來越小
if s > target:
# 如果大了,嘗試右邊界收縮一格,讓 target 變小
right -= 1
elif s < target:
# 如果小了,嘗試左邊界收縮一格,讓 target 變大
left += 1
else:
# 如果已經等於 target 的話, 肯定是最接近的,根據題目要求,返回這三個數的和
return target
return res
if __name__ == '__main__':
solution = Solution()
print(solution.threeSumClosest([-1,2,1,-4],1))