目錄
問題
給定一個包括 n 個整數的數組 nums
和 一個目標值 target
。找出 nums
中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
解題思路
分析:題目中有兩個關鍵信息:1)假定每組輸入只存在唯一答案;2)三個數的和與 target
最接近,返回這三個數的和。
這個問題的思考和LeetCode15題的三數之和非常類似,解題方法也類同博文:https://blog.csdn.net/weixin_42521211/article/details/88189536。不過這道題相對來說,更簡單,因爲限制了唯一,並且只需要返回三個數的和。
具體步驟:
1)先對數組進行排序,預設一個差值最小的數targetDiff(2**31-1),一個數組result來存儲三個數的下標;
2)第一層循環遍歷數組,第二層循環藉助雙指針遍歷思想,如果三數和與target差值等於0,則可以直接返回三數和:target;否則,判斷當前的三數之和與target的差值的絕對值與targetDiff比較,讓targetDiff保存當前差值最小的數,如果targetDiff值進行了更新,則result也進行更新,存儲當前的三個數的下標。
3)返回結果。最後,result記錄的即爲三個數在nums中的下標,因此取出求和即可。
詳細實現代碼如下:
python具體實現
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
numLen = len(nums)
# 特殊情況的處理:數組個數小於3 及 等於 3的情況
if numLen<3:
return 0
#if numLen== 3:
#return sum(nums)
nums.sort() # 數組排序
result = []
targetDiff = 2**31-1 # 初始預設的最大差值
for i in range(numLen):
# 雙指針實現
left = i+1
right = numLen-1
while left<right:
temp = nums[i]+nums[left]+nums[right]-target
if temp ==0:
return target
abstemp = abs(temp)
if abstemp<targetDiff:
result = [i,left,right]
targetDiff = abstemp
if temp>0:
right = right-1
else:
left = left+1
return nums[result[0]]+nums[result[1]]+nums[result[2]]
題外記
有了之前“三數之和”的實現經歷,完成這道題,就是小菜一碟了吧。(小嘚瑟下)