題目**,leetcode
題目描述:給定乙個整數陣列 nums和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解題過程和思路:當我瀏覽了一便這個題目的時候,心裡想,哇,通俗易懂,這不是超簡單的嘛。emmm,題目意思是懂了,那麼怎麼用計算機解呢?首先映入我腦海中的是:emm,最基礎的解法吧——暴力,把陣列所有可能的兩數之和都求出來不就好了,但是這樣子的做法時間複雜度是$o(n^2)$
, emmm,實在不可取。接著,我又想呀想呀,怎麼降低時間複雜度呢?排序怎麼樣?排序了之後從小到大遍歷陣列,算出每個數與後續數的和,由於排序過了,計算出來的求和結果將會是乙個遞增的序列,當求和結果大於目標值 target 之後便停止計算,接著遍歷陣列中第二個數。咦,好像可行,可以避免一些無用的求和計算。由於用了排序,因此時間複雜度在$o(nlogn)$
與$o(n^2)$
之間。博主太笨了,之後再想了許久也沒想到更優的解法,因此參考了leetcode上的大佬們的題解,哇,第一次感到世界如此奇妙。可以通過建立雜湊表,也就是字典的方式來加快查詢速度(空間換時間),具體怎麼做呢?。將陣列的值作為key,索引作為value建立字典,這樣子如果我們對於陣列中某個數num,要查詢是否存在另外乙個數another_num,使得兩數之和為target,那怎麼查詢 another_num 這個數比較快呢? 通過我們前面建立的字典,可以通過判斷字典的keys裡是否有another來查詢,因此查詢一般只需要o(1)時間(當沒出現衝突的時候)。
解題收穫:字典的妙用——以空間換時間的方式加快查詢效率,記好啦。
**展示:
class solution(object):
def twosum(self, nums, target):
""":type nums: list[int]
:type target: int
:rtype: list[int]
"""nums_d = {}
for index,num in enumerate(nums): # 遍歷nums陣列列舉兩個數中的第乙個數
another_num = target-num # 目標-第乙個數求第二個數
if another_num in nums_d: # 遍歷nums_d字典判斷兩個數中的第二個數是否存在
return min(index, nums_d[another_num]), max(index, nums_d[another_num]) # 若存在則返回
else:
nums_d[num] = index # 以num為兩個數中的第乙個數找不到答案,就將其放入存放第二個數的字典
結果展示:
LeetCode第1題 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。class solution object deftwosum self,nums,target ...
LeetCode 第1題 兩數之和
題目描述 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。解題思路 1 這道題可以直接用暴力法解。2 可能會用到的知識點 初始化乙個匿名陣列 new i...
LeetCode第2題題解 兩數相加
題目 leetcode 題目描述 給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0開頭。示例 輸入 2 4 3...