題目描述:
給定一個包括 n 個整數(shù)的數(shù)組 nums 和 一個目標(biāo)值 target。找出 nums 中的三個整數(shù),使得它們的和與 target 最接近。返回這三個數(shù)的和。假定每組輸入只存在唯一答案。
例如,給定數(shù)組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數(shù)的和為 2. (-1 + 2 + 1 = 2).
題目分析:
首先說明,這個代碼是別人的,我寫的太low了,就不拿出來了。
數(shù)組題基本上都是套路了,看到數(shù)組沒思路你就給它排個序,排完再想想就有點(diǎn)眉目了。如果你做過三數(shù)之和這道題,那你基本上做這道題也就差不多了。還是雙指針?排序的老套路,老老實(shí)實(shí)做就完事了。當(dāng)然由于是最接近的三數(shù)之和,所以你需要維護(hù)一個變量去保存每次三個數(shù)的和。
code:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
# 數(shù)組題如果沒思路記得排序一下就有思路了?。。? # 排除一些特定問題減少計算
# 如果只有3個數(shù),那直接返回這三個數(shù)的和
if len(nums) == 3:
return sum(nums)
nums = sorted(nums)
# 如果最小的和大于目標(biāo),那返回最小的和
if sum(nums[:3]) >= target:
return sum(nums[:3])
# 如果最大的和小于目標(biāo),那返回最大的和
if sum(nums[-3:]) <= target:
return sum(nums[-3:])
cur = nums[0] + nums[1] + nums[-1]
for i in range(0, len(nums) - 2):
# 避免重復(fù)計算
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