給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
我的辦法:
總體的思路是排序+雙指標,時間複雜度為。
首先,依然是將三個整數求和的問題,轉換為兩個整數求和。對於nums中的每乙個數nums[i],如果剩餘陣列中存在兩個整數nums[j]和nums[k],使得nums[j]+nums[k]最接近target-nums[i]即可。
其次,對nums排序必然會有助於提公升最終求解的效率。假設對nums由小到大排序,則當我們求解最接近target-nums[i]的nums[j]+nums[k]時,可以分為以下三種情況:
nums[j]+nums[k]==target-nums[i],直接return[i,j,k]
nums[j]+nums[k]>target-nums[i],k-=1。
nums[j]+nums[k]
每一步都記錄下當前的diff=abs(target-nums[i]-nums[j]-nums[k]),如果當前step的diff小於前一步的diff,則記錄下該更小的diff及相應的ans。在計算時應當保證j0:
j+=1
else:
return ans
if j別人的方法:我記錄了兩層迴圈內各自的最小diff,而以下方法只記錄了全域性的最小diff,顯然後者要更簡潔一些。
以下方法對nums中連續數字相同的情況做了處理,跳過了nums[i] = nums[i - 1]的資料,簡化了整個處理過程。
class solution(object):
def threesumclosest(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: int
"""nums.sort()
comp = 9999999
myans = 0
leng = len(nums)
for i, item in enumerate(nums):
f = i + 1
r = leng - 1
if (i == 0 or nums[i] != nums[i - 1]):
while (f < r):
ans = nums[i] + nums[f] + nums[r]
comptmp = ans - target
x = abs(comptmp)
#找最接近的
if (x < comp):
comp = x
myans = ans
#雙指標移動
if (comptmp == 0): return myans
elif (comptmp < 0): f += 1
else: r -= 1
return myans
以下是我參照上述思路改寫的版本,效果果然好了很多。執行用時: 68 ms, 在3sum closest的python提交中擊敗了92.11% 的使用者。記憶體消耗: 10.9 mb, 在3sum closest的python提交中擊敗了1.02% 的用。
class solution(object):
def threesumclosest(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: int
"""# 異常處理
if len(nums)<3:
return 0
# 陣列排序
nums=sorted(nums)
l=len(nums)
base_diff,base_ans=2**31-1,2**31-1
# 將三數之和轉化為兩數之和問題
for i in range(l-2):
j,k=i+1,l-1
# 採用雙指標處理
if (i==0 or nums[i]!=nums[i-1]):
while j0:
j+=1
else:
return ans
return base_ans
LeetCode 16 最接近的三數之和
題目傳送門 給定乙個包括 n 個整數的陣列nums和 乙個目標值target。找出nums中的三個整數,使得它們的和與target最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2 ...
leetcode 16 最接近的三數之和
給定乙個包括 n 個整數的陣列nums和 乙個目標值target。找出nums中的三個整數,使得它們的和與target最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2 1 2 顯然...
Leetcode 16 最接近的三數之和
給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2...