你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
題目中已說明只會對應乙個答案,所以先不考慮沒有答案和多個答案的場景。
暴力法就是對陣列進行遍歷,檢視每個元素x是否存在另乙個值等於target-x
複雜度分析:
時間複雜度:o(n2), 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o(n) 的時間。因此時間複雜度為 o(n2)
空間複雜度:o(1)。
**1:
class
solution}}
return result;}}
;
結果:
效能很低啊,擊敗0.98%的使用者,那我們對暴力法我們做乙個小小的優化,效能就可以提公升很多,就是儘量減少其中的加減運算。
**2:
class
solution}}
return result;}}
;
結果
暴力法的時間複雜度是o(n2),再怎麼優化也難以縮短他的執行時間了,所以要找時間複雜度更小的方法。
將陣列先排個序,然後從兩頭開始向中間查詢最合適的,找到合適的跳出就可以了。
複雜度分析:
時間複雜度:o(n), 我們把包含有 n 個元素的列表遍歷兩次。
空間複雜度:o(n), 所需的額外空間取決於雜湊表中儲存的元素數量,該表中儲存了 n 個元素。
**3
class
solution
if(sum < target)
//左邊數小了
else
//右邊數大了
}
vector<
int> retvec;
for(
int i =
0; retvec.
size()
<
2&& i < nums.
size()
;i++
)/*尋找原來的位置*/
}return retvec;}}
;
結果使用unordered_map,需要使用c++11以上。
unordered_map內部實現了雜湊表,因此其查詢速度非常的快,缺點是建立unordered_map比較慢,耗記憶體。
使用count,返回的是被查詢元素的個數。如果有,返回1;否則,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
雜湊法用空間換時間吧。
在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。
複雜度分析:
時間複雜度:o(n), 我們只遍歷了包含有 n 個元素的列表一次。在表中進行的每次查詢只花費 o(1) 的時間。
空間複雜度:o(n), 所需的額外空間取決於雜湊表中儲存的元素數量,該錶最多需要儲存 n 個元素。
**4
class
solution
hashmap[nums[i]
]= i;
}return retvec;}}
;
結果同樣雜湊的思想,我們用golang來實現一下,看看golang和c++的效能:
**5
func twosum(nums int, target int) int
} else
}return int{}
}
結果
沒想到golang如此強悍。
執行結果時間並不固定,和力扣的伺服器繁忙度還有引數變化有關吧。空間占用是比較固定的。
排序法和雜湊法在時間複雜度上的優勢,注定效率高於暴力法。
兩數之和 力扣
這是我寫的第一篇部落格,以前也有過想法,但是總是懶惰,昨晚正好開始刷力扣,就用部落格全程記錄一下吧。刷的第一道題目是兩數之和,題目是這樣的 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。...
力扣 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...
力扣 兩數之和
題目很簡單,但是如果用一般的方法,會超出時間限制。所以需要另一種思路,題解給的另一種思路是 查詢表法 有2種實現方法,雜湊表和平衡二叉搜尋樹。因為不需要維護表中元素的順序,所以就用雜湊表。不知道為啥,很奇怪,我自己寫的暴力演算法,第一次測試,系統說超出時間限制,我覺得是我的問題,然後就開始研究,找了...