給定一個整數數組 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中大神,我這裏只是照貓畫虎,類似筆記,爲的以後好翻來看看。