LeetCode刷題 , 兩數之和 , 雜湊表

2021-10-08 21:04:43 字數 2898 閱讀 3813

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

你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。

示例:給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路:解題的關鍵是找到 " num2=target-num1" 是否在給定的整數陣列nums(list)中。使用如下的兩個方法解決:

**函式如下:

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

: lens =

len(nums)

j=-1

for i in

range

(lens):if

(target - nums[i]

)in nums:

if(nums.count(target - nums[i])==

1)&(target - nums[i]

== nums[i]):

#如果num2=num1,且nums中只出現了一次,說明找到是num1本身。

continue

else

: j = nums.index(target - nums[i]

,i+1

)#index(x,i+1)是從num1後的序列後找num2

break

if j>0:

return

[i,j]

else

:return

執行通過,不過耗時較長,為1048ms。

在上述方法的基礎上改進演算法,想著,num2 的查詢並不需要每次從 nums 查詢一遍,只需要從 num1 位置之前或之後查詢即可。但為了方便 index 這裡選擇從 num1 位置之前查詢:

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

: lens=

len(nums)

j=-1

for i in

range(1

,lens)

: temp=nums[

:i]if

(target-nums[i]

)in temp:

j=nums.index(target-nums[i]

)break

if j>=0:

return

[i,j]

執行通過,耗時減少一半多為444ms。

時間複雜度:對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,所以對應的時間複雜度是o(n)*o(n);

空間複雜度是:o(n)。

這裡先將陣列排序好o(nlogn),再利用雙指標法遍歷一遍o(n)得到結果。為了儲存下標資訊另開了乙個陣列。

時間複雜度o(nlogn),空間複雜度o(n)

**如下:

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

: temp=nums.copy(

) temp.sort(

) i=

0 j=

len(nums)-1

while iif(temp[i]

+temp[j]

)>target:

j=j-

1elif

(temp[i]

+temp[j]

)i=i+

1else

:break

p=nums.index(temp[i]

) nums.pop(p)

k=nums.index(temp[j]

)if k>=p:

k=k+

1return

[p,k]

執行通過,使用時間76ms,大幅縮短執行時間。

利用 undered_map 陣列構造對映,遍歷 nums[i] 時,看 target-nums[i] 是否存在hash表中即可。

時間複雜度o(n),空間複雜度o(n)

**如下:

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

: hashset=

for i in

range

(len

(nums)):

if hashset.get(target-nums[i])is

notnone

:return

[hashset.get(target-nums[i]

),i]

hashset[nums[i]

]=i

執行通過,執行時間76ms。

leetCode刷題 兩數之和

兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums...

leetCode刷題 兩數之和

兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums...

LeetCode刷題 兩數之和

給定乙個整數陣列nums和乙個整數目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。你可以按任意順序返回答案。示例 1 輸入 nums 2,7,11,15 target 9 輸出 0,1 解釋...