LeeCode 1 :兩數之和

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

這是非常典型的一道使用哈希表來處理的題目,這道題中用到的哈希表非常簡單,容易理解,讓大家感受一下哈希表有多強大。
暴力解法:
話說暴力就是我們對於這道題最直觀的理解,遍歷每一個元素,然後再從數組中查找與之匹配的數字,時間複雜度很高,O(n^2)。查找匹配數字的過程,最簡單的方法當然是依次查找。但是,有優化的空間,我們可以只遍歷當前元素之前的列表,這樣可以省去很多無用的查找過程。程序如下:

    def twoSum(self, nums, target):
        for i in range(1,len(nums)):
            num = nums[:i]
            if (target - nums[i]) in num:
                j = num.index(target - nums[i])
                break
        return [j,i]
   #耗時532ms

hash解法:
暴力法最浪費時間的地方在於匹配過程,我們需要在列表中依次查找目標數值從而得到對應下標。如果列表中的元素與下標間用映射函數聯繫起來,建立哈希表,只要得到目標值,通過查詢哈希表直接得到其下標而不是依次遍歷,就可以省去很多時間。這裏,我們使用字典來模擬哈希表,程序如下:

    def twoSum(self, nums, target):
        hashdict = {}
        for i, num in enumerate(nums):
            if hashdict.get(target - num) is not None:
                return [hashdict.get(target - num),i]
            hashmap[num] = i
    #耗時56ms

注意上下對比,其實,我們只是把列表查詢改爲了字典查詢(hash查詢),都是隻遍歷當前元素之前的列表,時間相差懸殊,這就是哈希表思想的好處。
注:其實解法都是來自leecode中大神,我這裏只是照貓畫虎,類似筆記,爲的以後好翻來看看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章