LeetCode:16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
nums = [-1,2,1,-4],target = 1
与 target 最接近的三个数的和为 2。(-1 + 2 + 1 = 2)。
思路:
- 排序
- 从头遍历,固定第 i 个元素,双指针从 i+1、len(nums)-1 处向中间遍历,寻找和与 target 距离最小的组合
- 若当前和小于 target,则 left 右移;若当前和大于 target,则 right 左移
- 优化:
- 当前和等于 target 时,为最小距离 0,直接返回
附代码(Python3):
class Solution:
def threeSumClosest(self, nums, target):
if len(nums) < 3:
return None
nums.sort() # 排序
dis = float('inf') # 初始化距离
for i in range(len(nums)-2):
left, right = i+1, len(nums)-1
while left < right:
cur = nums[i]+nums[left]+nums[right]
if abs(cur-target) < dis:
dis = abs(cur-target) # 更新距离
res = cur # 更新三数和
if cur < target:
left += 1
elif cur > target:
right -= 1
else: # 若cur=target,距离最小为0,直接返回
return res
return res
test = Solution()
nums_li = [[-1, 2, 1, -4], [1,1,-1,-1,3], [1,2,4,8,16,32,64,128]]
target_li = [1, 3, 82]
for nums, target in zip(nums_li, target_li):
print(test.threeSumClosest(nums, target))
2
3
82