LeetCode 1兩數之和

2021-09-12 08:44:28 字數 2283 閱讀 1352

好久沒刷leetcode了,這幾個月打算重新補一下演算法,那就從第一題重新刷了,順便寫一組解題報告

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:給定 nums =[2

,7,11

,15], target =

9因為 nums[0]

+ nums[1]

=2+7

=9所以返回 [0,

1]

我a了這題四次,每一次都是一次效能優化

一開始拿到題目,自然而然就想到直接o(n^2),就是直接遍歷列表,取乙個值,然後再遍歷一次列表,找到兩個相加等於目標數的值,返回下標即可。

#戰勝 27.32 % 的 python 提交記錄

#執行用時3992 ms

class

solution

(object):

deftwosum

(self, nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: list[int]

"""for i in

range

(len

(nums)):

for j in

range

(i +1,

len(nums)):

if(nums[i]

+ nums[j]

== target)

:return

[i,j]

這種速度顯然我們是不會滿意的,那麼我又思考了一下,就是遍歷列表一次,然後用目標值和nums[i]做差,然後得出差的值,並使用python的in關鍵字檢視差的值是否在列表中(前提是差值的下標和i不相等),如果有這個情況存在,那麼我們使用nums.index(tgt)返回我們要找的和tgt相等的值的下標。然後返回。
#戰勝 54.29 % 的 python 提交記錄

#執行時間916 ms

class

solution

(object):

deftwosum

(self, nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: list[int]

"""for i in

range

(len

(nums)):

tgt = target - nums[i]

if tgt in nums:

if nums.index(tgt)

!= i:

if nums.index(tgt)

> i:

return

[i,nums.index(tgt)

]else

:return

[nums.index(tgt)

,i]else

:continue

可以看到速度優化了不少,但是還是不夠,我沒想到更好的辦法,於是看了下排名較高的大佬的題解

他們的**是這樣的

#戰勝 98.36 % 的 python 提交記錄

#執行時間28 ms

class

solution

:def

twosum

(self,nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: list[int]

"""n =

len(nums)

d =for x in

range

(n):

a = target - nums[x]

if nums[x]

in d:

return d[nums[x]],x

else

: d[a]

= x

**非常簡單,建立了乙個字典d,遍歷一次列表,每過一項,如果不滿足對應項的值在字典的鍵中找到,那麼就把對應項的值和目標值的差作為鍵,下標作為值塞到字典裡,直到找到對應的項在字典的鍵中找到,那麼返回[d[nums[x]],x]。可以看到演算法已經優化到極致了。

LeetCode 1 兩數之和

給定乙個整數數列,找出其中和為特定值的那兩個數。你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 step 1 class solution object def tw...

leetcode 1 兩數之和

1.兩數之和 這道題和程式設計之法上面的題目有以下幾個不同 1 題目所給定的陣列是無序的,程式設計之法裡面是預設有序的 2 要求輸出原陣列的序號,如果用乙個結構體維護陣列下標,那麼需要o n 的空間,顯然不是最好的方法 3 題目中包含負數,之前想用數值直接表示陣列下標,陣列值為原來的真正陣列下標,但...

leetcode 1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 class solution for int i 0 ...