1. 程式人生 > 實用技巧 >LeetCode第一題題解:兩數之和

LeetCode第一題題解:兩數之和

LeetCode第一題:兩數之和


Ps:本系列文章只為記錄自己刷LeetCode過程中的解題過程和思路。


題目來源,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為兩個數中的第一個數找不到答案,就將其放入存放第二個數的字典


結果展示