Given an array of integers
nums
and an integertarget
, return indices of the two numbers such that they add up totarget
.You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.
經典的 LeetCode 第一題。
題目要我們從給定的數組 nums
中,找出相異的兩數使之總和為 target
,並回傳該兩數的 index,順序不拘。
直覺的 BF 解法,迭代兩次 nums
以嘗試每一種可能的組合,若兩數相加符合題目要求的 target
就回傳 index。
這裡要特別注意到第二次的 for
迴圈,若從j = i
開始,會造成相同的數重複計算的情形,導致結果出錯,因此這裡只需要從 j = i+1
開始就好了。
nums
數組,時間複雜度為。由於此題目需要頻繁的查找,因此若使用可以增加查找效率的資料結構就會很有幫助,而這個結構就是查找複雜度為 的 Hash Map。
(注意在 c++ 中的 Hash Map 為 unordered_map
,而不是一般的 map
,map
底層為 RB-Tree 結構,查找需要花費 )。
我們用此結構把目前看過的數字加入其中,在之後看其他數字時,便可以用 的時間來查詢是否可以與之前已經看過的數字配對。
我們將 target
減去現在看到的數字,所得即為與之配對的數字,接著檢查我們是否已經有看過(即存在 map
裡),若有則回傳解答,若無則將此數字加入 map
裡,供下次查找用。
nums
數組,insert
、find
等操作皆為 ,因此時間複雜度為。unordered_map
儲存資料,最差狀況為 。LeetCode
Blind75