LeetCode——第一題(Python):兩數之和

題目

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

示例

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

思路

使用python中的dict,dict應用了哈希表的原理。建立一個字典,字典的關鍵字是這組數的值,字典的內容是這組數值的下標,我們查找target-nums(k)和nums(k)是否在字典中來找到答案。

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        map={}
        k=0
        while k < len(nums):
            if not nums[k] in map: 
                map[nums[k]] = k
            if target-nums[k] in map:
                if map[target-nums[k]] < k:
                    return [map[target-nums[k]],map[nums[k]]]
            k = k + 1

代碼提交之後提示運行錯誤,這是因爲dict中的關鍵字不能重複,我們每一次都先把nums(k)寫入字典,再進行target-nums(k)的尋找,而當給定的數中有重複數字時,則會導致以下代碼

if not nums[k] in map: 
                map[nums[k]] = k

構建字典不成功,無法正確的進行計算。

於是更改代碼,先進行target-nums(size)的尋找,如果找到直接輸出,如果未找到,再寫入字典,這樣就避免了重複元素對構建字典的影響。

運行成功的代碼

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        map=dict()            
        k=len(nums)         
        for i in range(0,k):
            temp=target-nums[i]
            if temp in map:         
                return [map[temp],i]
            map[nums[i]]=i          

運行結果

知識點get

哈希表

  • 散列表(Hash
    table,也叫哈希表),是根據關鍵碼值(Key和value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
  • 給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後若能得到包含該關鍵字的記錄在表中的地址,則稱表M爲哈希(Hash)表,函數f(key)爲哈希(Hash)
    函數。

衝突

  • 對不同的關鍵字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),這種現象稱爲衝突。具有相同函數值的關鍵字對該散列函數來說稱做同義詞。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章