題目描述:
給定一個(gè)包括 n 個(gè)整數(shù)的數(shù)組 nums 和 一個(gè)目標(biāo)值 target缔御。找出 nums 中的三個(gè)整數(shù)钥弯,使得它們的和與 target 最接近。返回這三個(gè)數(shù)的和休讳。假定每組輸入只存在唯一答案。
例如尿孔,給定數(shù)組 nums = [-1俊柔,2,1活合,-4], 和 target = 1.
與 target 最接近的三個(gè)數(shù)的和為 2. (-1 + 2 + 1 = 2).
題目分析:
首先說明雏婶,這個(gè)代碼是別人的,我寫的太low了白指,就不拿出來了留晚。
數(shù)組題基本上都是套路了,看到數(shù)組沒思路你就給它排個(gè)序告嘲,排完再想想就有點(diǎn)眉目了错维。如果你做過三數(shù)之和這道題奖地,那你基本上做這道題也就差不多了。還是雙指針?排序的老套路赋焕,老老實(shí)實(shí)做就完事了参歹。當(dāng)然由于是最接近的三數(shù)之和,所以你需要維護(hù)一個(gè)變量去保存每次三個(gè)數(shù)的和宏邮。
code:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
# 數(shù)組題如果沒思路記得排序一下就有思路了T笫尽!蜜氨!
# 排除一些特定問題減少計(jì)算
# 如果只有3個(gè)數(shù)械筛,那直接返回這三個(gè)數(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ù)計(jì)算
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