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...