題目:兩數之和
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賦值自動抹除