程式設計學習(一)兩數之和

2021-09-02 22:04:48 字數 2950 閱讀 1388

leetcode第一道題目:

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

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

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

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

所以返回 [0, 1]

剛開始的想法是採用兩個for迴圈巢狀採取下標的方式,一旦滿足要求便將下標刪除,依次遍歷。

**如下

class

solution

:def

twosum

(self, nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: list[int]

"""index =

[k for k in

range

(len

(nums))]

# 執行n次

for i in index:

# 執行n次

for j in index[i+1:

]:# 執行n-i次

if nums[i]

+nums[j]

==target:

index.remove(i)

index.remove(j)

return

[i,j]

則根據時間複雜度的運算規則可知t(n)=o(n^2)

在leetcode的測試提交平台

6352ms執行時間很長

這時,如果想要改進我們的**的執行效率的話便可以考慮去掉乙個for迴圈。

class

solution

:def

twosum

(self, nums, target)

: n =

len(nums)

for x in

range

(n):

# 執行n次

a = target - nums[x]

if a in nums:

# 需要遍歷n次

if x!=nums.index(a)

:#當兩個元素的下標不等的時候

return

[x,nums.index(a)

]

可能最壞的情況下時間複雜度為t(n)=o(n^2)(補充:python中list物件的儲存結構採用的是線性表,因此其查詢複雜度為o(n) 也就是 if a in nums 時間複雜度是o(n))

leetcode平台測試結果:

可以看出結果比之前要好很多

建立字典形式,差值為 鍵,索引為值。

def

twosum

(self, nums, target)

: d=

n =len(nums)

for i in

range

(n):

a = target - nums[i]

if a in

(d.keys())

:return

[i,d[a]

]else

: d[nums[i]

]= i

則可以看出其時間複雜度為o(n).

leetcode的結果:

可以看出執行速度有了質的提公升。

那為什麼用了字典結構會有如此大的提公升呢?

那是和字典的實現原理有關係

字典字典的實現過程用到了乙個叫雜湊表的資料結構。

雜湊表(也叫雜湊表),根據關鍵值對(key-value)而直接進行訪問的資料結構。它通過把key和value對映到表中乙個位置來訪問記錄,這種查詢速度非常快,更新也快。而這個對映函式叫做雜湊函式,存放值的陣列叫做雜湊表。 雜湊函式的實現方式決定了雜湊表的搜尋效率。具體操作過程是:

資料新增:把key通過雜湊函式轉換成乙個整型數字,然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標,將value儲存在以該數字為下標的陣列空間裡。

資料查詢:再次使用雜湊函式將key轉換為對應的陣列下標,並定位到陣列的位置獲取value。

但是,對key進行hash的時候,不同的key可能hash出來的結果是一樣的,尤其是資料量增多的時候,這個問題叫做雜湊衝突。如果解決這種衝突情況呢?通常的做法有兩種,一種是鏈結法,另一種是開放定址法,python選擇後者。

想深入了解的可以參考這篇文章 列表

因此列表有以下特點:

元素有位置下標,以索引就可以直接取到元素 --> 連續的儲存空間,以偏移量計算取得元素,不必遍歷所有元素

元素無論如何改變,表物件不變,也就是其id不變 --> 分離式結構,表頭和元素內容分開儲存,這樣在更改list時,表物件始終是同乙個,只是其指向的位址不同

元素可以是任意型別 --> 既要要求是連續儲存,又可以儲存不同型別的資料,那麼其用的就是元素外接的方式,儲存的只是位址的引用

可以任意新增新元素 --> 要能不斷地新增新元素,其使用了動態擴充的策略

從實現上來講,在python中建立空ist時,會申請乙個8個元素大小的記憶體區域。以後如果滿 了,就擴容4倍,且當元素總數達到50000時,再擴容就改為2倍。

還有其他的方法暫時沒有了解也想不出來,仍然需要努力。

leetcode 一 兩數之和

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

演算法練習一 兩數之和

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

LeetCode演算法題(一) 兩數之和

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