兩數(shù)之和
夢(mèng)開始的地方
?段優(yōu)美的前?,喲,喲:
●?年輕的碼農(nóng)喲~ 你是不是?直在思考?我提升的問題~
●?思來想去,決定從算法抓起(單押)~
●?拿起?放下,經(jīng)歷過多少次放棄(單押 ? 2)~
●?決定了!這次讓我來幫你梳理(單押 ? 3)!Skr~

坦誠(chéng)相?吧,兩數(shù)之和!
●?《兩數(shù)之和》是算法學(xué)習(xí)過程中最最經(jīng)典也是最最基礎(chǔ)的?個(gè)問題。
●??扣、?客等刷題?站排?最?的就是兩數(shù)之和了,經(jīng)典就有其經(jīng)典的道理,《兩數(shù)之和》因?yàn)楸旧聿]有太?的難度,?
●?且也能體現(xiàn)出?些算法的思想,所以作為??必刷題來說,再合適不過了。

那么咱們先來看題目吧

●?確定一個(gè)目標(biāo)值
●?接下來就是需求分析
○?從給出的 nums 數(shù)組中找到兩個(gè)數(shù)字, 兩個(gè)數(shù)字的和是 target
○?有且只有一個(gè)唯一解
○?找到兩個(gè)數(shù)字以后, 返回兩個(gè)數(shù)字的下標(biāo)
●?比如
○?這里的答案就是 2 和 5
○?因?yàn)?nums[2] + nums[5] = 9 符合要求
開始搞起來
暴力破解
作為一個(gè)入門的程序員, 一個(gè)小趴菜, 我都覺得這個(gè)玩意對(duì)于我來說實(shí)在是太簡(jiǎn)單了
明?了!挨個(gè)對(duì)?挨個(gè)找?遍不就得了,小小問題,難不倒真正的勇?,看我破他護(hù)體真?,雙重循環(huán)暴?解法奉上!
●?完全沒有問題, 搞定, 我真是太棒了
給我的小伙伴們看完這個(gè)答案以后, 我的嘴角微微上揚(yáng), 已經(jīng)準(zhǔn)備好接受大家的表揚(yáng)了
你們這是什么眼神, 我怎么了, 難道不對(duì)嗎 ??
但是提交上去之后,分?jǐn)?shù)并不?,說這種?法性能不好,暴?解法采?雙重循環(huán)嵌套的話,雖然解決了問
題,但是執(zhí)?判斷的次數(shù)?約是:(n-1) + (n-2) + (n-3) + ... + 1次
●?從之前學(xué)過的時(shí)間復(fù)雜度來分析的話,暴?解法的時(shí)間復(fù)雜度?約是O(n(n-1))即O(n2-n),雖然時(shí)間復(fù)雜度?于O(n2),但是
●?實(shí)際也沒好到哪?去,當(dāng)然分?jǐn)?shù)不?咯。

●?好吧,好吧,真是拿你沒有辦法(扶眼鏡)~,接下來,我們來轉(zhuǎn)換思路,另辟蹊徑!
秘法 · 空間換時(shí)間
●?所謂的空間換時(shí)間,其實(shí)指的就是,針對(duì)這樣兩層遍歷的情況,我們可以在遍歷的過程中,?邊去判斷,?邊做存儲(chǔ),判斷
●?找到了就返回,沒找到,那就存起來等到下?次判斷的時(shí)候看看是否能找的到,這樣?邊判斷、?邊存儲(chǔ)的?式當(dāng)然快咯,
●?因?yàn)楫吘怪恍枰闅v?次嘛,吶,舉個(gè)栗?:

●?有?隊(duì)?朋友,要找到他們做任務(wù)的搭檔,我們就可以先挨個(gè)把?朋友叫過來(開始遍歷),讓他從?個(gè)本?上去找,看本 ?上的照?有沒有??的搭檔(做判斷)。
●?如果找到了,那?朋友就可以?聲報(bào)告出來(返回結(jié)果),如果沒找到呢,就把這個(gè)?朋友的照?貼在本?上,然后叫下? 個(gè)?朋友進(jìn)來找(存儲(chǔ)后繼續(xù)遍歷)。
●?這樣是不是性能和效率就?很多了,?常Nice,換個(gè)思路,果然有另外收獲!

●?好了,開打,開打!代碼奉上!
●?這次的?法,我們只?了?次循環(huán),就解決了問題,時(shí)間復(fù)雜度當(dāng)然就是O(n)咯,只是在函數(shù)運(yùn)?的過程中,創(chuàng)造了?個(gè) map對(duì)象在占?內(nèi)存空間,雖然函數(shù)之后map對(duì)象被回收了,但是總的來說是消耗了?些內(nèi)存的。
●?但是雖然計(jì)算的時(shí)候占?了內(nèi)存,但是?常明顯的提?了效率和性能,ok,ok,得償所愿!

最后劃?個(gè)道道
●?所以說,所謂的空間換時(shí)間,真的?常適合?在?些查找類的算法需求中,以后再碰到這樣的需求,我們不要再研究雙重循
●?環(huán)嵌套查找啦,來嘗試下空間!換!時(shí)間吧!少年!咱們下期再?ヾ( ̄▽ ̄)Bye~Bye~

兩數(shù)之和的評(píng)論 (共 條)
