LeetCode-1.兩數之和——靈活掌握不同數據結構的特性會顯著降低時間複雜度

題目:兩數之和

 

right answer

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashmap = dict()
        for idx,n in enumerate(nums):   # 其實遍歷一次就夠了
            if target-n in hashmap:   # 兩數之和,兩個數可以一樣,但角標不可一樣
                return [hashmap[target-n], idx] if hashmap[target-n] < idx else [idx,hashmap[target-n]]   # 確保更小的角標在前
            hashmap[n] = idx
        return [] # 無答案

思路

兩數之和,要想到這是個“查找”問題,那麼使用哈希表就比純數組要好很多,畢竟數組的查找是遍歷,複雜度O(N),而哈希表是O(1)!

此外,直覺上使用哈希表是要循環2次,一次是dict的存儲(元素需要一個個地被存入),一次是遍歷dict進行查找。但由於哈希表查找速度是O(1),因而其實還是O(N)的複雜度;

但實際上不需要兩次循環。因爲有答案的結果一定是成對出現的,所以只要追溯到了後者,前者就一定會被“撈出來”。

最後,12行的賦值代碼必須不能在if判斷之前,以確保nums數組裏相同的數值不會被dict賦值自動抹除

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