一、前言
最近在刷力扣上的題目,之前也刷過很多次,一邊刷一邊忘,很是苦惱。
爲什麼邊學邊忘,很大程度是沒有應用場景,只是被動的進行填鴨式學習。
爲了提高學習效率,覺得還是得堅持寫博客,一方面強化記憶,第二強迫自己創造應用場景,學習知識的同時也在產生知識。
二、題目
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
三、暴力解題法
3.1 思路:
用for循環將數組中的元素和後面的元素分別相加,看是否等於 target ,如果不等於 target,那麼就繼續拿數組裏的第二個數字和後面的數字相加;不停的去一個個試…直到等於target,返回這2個數字所在的下標。
nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
n = len(nums) # # 獲取nums的長度,是4
for x in range(n): # # 外層循環先取出下標0,對應着數組裏的第一個數字
for y in range(x+1, n): # 內層循環取出下標1,對應着數組裏的第二個數字
if nums[x] + nums[y] == target: # 如果滿足條件則return下標
return [x, y]
else: # 不滿足則跳過當前循環
continue
return None # 都不滿足,則返回None
a = twoSum(nums,target)
print(a)
3.2 總結:
提交力扣,這種解法比較耗時和佔用內存,繼續優化。
四、容器緩存法
4.1 思路
-
先遍歷所有的數組元素_—— nums[i],計算 target - nums[i],並將結果緩存到容器中,在後續循環中,如果再看到這個值,則返回兩者的下標位置。
-
空間複雜度:O(n)
-
時間複雜度:O(n)
# 容器緩存法
nums = [2, 7, 11, 15]
target = 9
def twoSum(nums,target):
lis = {} # 設置一個容器字典,用來緩存結果和下標
for index, num in enumerate(nums): # 獲取數值和下表
result = target - num # 結果
if num in lis: # 如果數值存在容器中,則返回第一個數值下標,和當前數值下標
return [lis[num], index]
lis[result] = index # 將結果作爲容器的key,數值的下標作爲value
return None
print(twoSum(nums,target))
4.2 總結:
用時縮短接近10倍
五、相關知識點
容器中的操作時間複雜度: https://wiki.python.org/moin/TimeComplexity