Leetcode 16 最接近的三數之和

2021-09-19 06:42:09 字數 2281 閱讀 4899

給定乙個包括 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...