題目描述
解題思路
先說一種很容易想到的暴力解法
暴力解法的思路很簡單,就是遍歷數組,對于每一個元素,都去遍歷數組中剩下的元素,判斷是否有兩個元素的和等于目標值,如果有,就返回這兩個元素的下標。
class Solution(object):def twoSum(self, nums, target):for i in range(len(nums)):rest = nums[i+1:]for j in range(len(rest)):if nums[i] + rest[j] == target:return [i, i+j+1]
嘗試提交,通過,時間復雜度為O(n^2)
。
顯然上面的方法不夠優雅,再說一種優雅的解法
暴力解法是把每一個數都遍歷,然后返回下標,但是這個遍歷的過程顯然是太過于耗時了,那么我們能不能使用一個數據結構把已經遍歷過的數據存儲起來,然后往后遍歷的時候,求和的時候直接去除先前數據的下標呢?
有的,有的兄弟!我們可以使用字典來存儲,當然,你也可以叫他哈希表(HashMap
),其實在Python
中,這就是字典,為什么叫他哈希表呢,這是因為這個存儲思想就是基于操作系統中哈希存儲的。
那么我們可以這樣來操作:我們遍歷所有的數據,以數據的值為鍵,以它的下標為值,存儲到哈希表中,然后每次都判斷目標的值和當前所遍歷的值的差是否在哈希表中,如果在,直接返回當前數的下標和哈希表中數的下標,否則繼續。
開始手搓!
class Solution(object):def twoSum(self, nums, target):num_dict = {}for i in range(len(nums)):if target - nums[i] in num_dict.keys():return [i, num_dict[target-nums[i]]]else:num_dict[nums[i]] = i
嘗試提交,通過,時間復雜度為O(n)
。
總結
可以看到,執行時間從2172ms降到了3ms,效率提升了700倍!自然就變得優雅了。