题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
题目分析:
首先说明,这个代码是别人的,我写的太low了,就不拿出来了。
数组题基本上都是套路了,看到数组没思路你就给它排个序,排完再想想就有点眉目了。如果你做过三数之和这道题,那你基本上做这道题也就差不多了。还是双指针➕排序的老套路,老老实实做就完事了。当然由于是最接近的三数之和,所以你需要维护一个变量去保存每次三个数的和。
code:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
# 数组题如果没思路记得排序一下就有思路了!!!
# 排除一些特定问题减少计算
# 如果只有3个数,那直接返回这三个数的和
if len(nums) == 3:
return sum(nums)
nums = sorted(nums)
# 如果最小的和大于目标,那返回最小的和
if sum(nums[:3]) >= target:
return sum(nums[:3])
# 如果最大的和小于目标,那返回最大的和
if sum(nums[-3:]) <= target:
return sum(nums[-3:])
cur = nums[0] + nums[1] + nums[-1]
for i in range(0, len(nums) - 2):
# 避免重复计算
if i > 0 and nums[i] == nums[i - 1]:
continue
j = i + 1
k = len(nums) - 1
while j < k:
res = nums[i] + nums[j] + nums[k]
if abs(res - target) < abs(cur - target):
cur = res
elif res == target:
return target
elif res < target:
j = j + 1
else:
k = k - 1
return cur