前言
作為一名非科班出身的程序員,我是參加工作之后才開始接觸算法,學(xué)算法至今有將近五年的時間,期間輸出文字約 100 多萬,從算法小白到寫出百萬閱讀的算法文章,這一路歷程,有心酸也有掌聲。
過往歷歷在目,沒有誰比我更了解算法小白的焦慮與迷茫。
每每在公眾號后臺看到讀者留言求教時,我都在想:我能為他們做點什么。
我決定把我曾經(jīng)踩過的坑以及總結(jié)出來的經(jīng)驗毫無保留的分享給你,希望能為你撥開迷霧。
這些經(jīng)驗并不會適合每個人,但或許也能對你有所啟發(fā)。
今天這篇文章聊的話題就是新手如何有效的刷算法題(LeetCode)。
如果你想要開始刷題,那么第一步就是:打開 LeetCode 官網(wǎng),點擊標(biāo)簽,選擇一道順眼的題目開始刷。
注意,在這過程中,不要左思右盼,不要去搜索與思考到底是刷 LeetCode 好還是去牛客網(wǎng)刷劍指 Offer 好。
我作為一名算法小白的時候,就犯了這個錯誤:在粗略的了解基本的數(shù)據(jù)結(jié)構(gòu)與算法后,準(zhǔn)備開始刷題,總想著找一個最有效最好的刷題平臺。
一會在 LeetCode 題解區(qū)逛逛,一會在牛客網(wǎng)看看面經(jīng),結(jié)果就是整個人煩躁不安,焦慮迷茫,題沒有刷幾道,羨慕嫉妒恨卻增加了幾分:別人的代碼怎么這么簡潔 ?別人的 Offer 怎么這么亮眼?
經(jīng)過痛定思定之后,我開始自我剖析自己想好好刷題卻無效的原因:
1、沒有接受自己是算法小白的事實
我那時候只是按圖索驥般的稍微系統(tǒng)的接觸了基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與算法知識,根本沒有真正的利用這些知識去處理問題。
在刷題的過程中,總想證明自己可以的,別人可以寫成簡潔高效的解題方法,我也要!于是去不停的找題證明自己,結(jié)果就是越刷越?jīng)]有效果,自己根本就看不懂題目考察的數(shù)據(jù)結(jié)構(gòu)與思想。
整個人完全奔潰,不刷題了,不準(zhǔn)備算法面試了,不準(zhǔn)備跳槽了!
后來我不停的告誡自己:作為一名非科班的程序員,肯定比不上他們呀,如果隨隨便便的學(xué)了一點就能刷題順利,那別人大學(xué)四年不白學(xué)了!
所以前期先接受自己的思考方式,暴力解法其實也是一種有效的解法。
2、沒有合理的刷題
我只是盲目的追求刷題的數(shù)量,即使刷了 200 道,腦中依舊一團漿糊。
后來才明白,吃透一道題目比亂刷十道題目更有價值。
經(jīng)過不斷的摸索與試驗,形成了自己的一套刷題路徑。
自己的解法
網(wǎng)上好的解法
自己的解法可以優(yōu)化的地方
不停的優(yōu)化
尋找相同的題型
總結(jié)
每一個題目都經(jīng)過至少一遍這樣的迭代,徹底吃透一道題進(jìn)而掌握一種題型。
以一道極其簡單的動態(tài)規(guī)劃題為例 ,LeetCode 第 70 號問題:爬樓梯。
當(dāng)時的我根本不知道動態(tài)規(guī)劃的相關(guān)概念,什么狀態(tài),什么轉(zhuǎn)移方程,通通沒聽過。
沒錯,當(dāng)時就那么菜!
二話不說,直接使用暴力解法。
classSolution{ publicintclimbStairs(intn){ returncalcWays(n); } privateintcalcWays(intn){ if(n==1)return1; if(n==2)return2; returncalcWays(n-1)+calcWays(n-2); } }
很明顯,無腦的遞歸暴力解法包含了大量的重復(fù)計算,提交上去直接標(biāo)紅提示超出時間限制。
后來看了網(wǎng)上高票答案的分析,知道了備忘錄的概念,于是很容易寫出優(yōu)化后的代碼。
//采用備忘錄的方式來存子問題的解以避免大量的重復(fù)計算 classSolution{ int[]memo; publicintclimbStairs(intn){ memo=newint[n+1]; returncalcWays(n); } privateintcalcWays(intn){ if(n==1)return1; if(n==2)return2; if(memo[n]==0) memo[n]=calcWays(n-1)+calcWays(n-2); returnmemo[n]; } }
再后來,發(fā)現(xiàn)備忘錄是自頂 向下的方式,稍許變動,修改為自低 向上的遞推方式就是動態(tài)規(guī)劃的形式。
classSolution{ publicintclimbStairs(intn){ int[]memo=newint[n+1]; memo[0]=1; memo[1]=1; for(inti=2;i<=?n;?i++){? ????????????memo[i]?=?memo[i-1]?+?memo[i-2];? ????????}? ????????return?memo[n];? ????}? }
按照這樣的刷題路徑下來,發(fā)現(xiàn)對這類題型有了初步的思考途徑,有了發(fā)力點,再也不會一籌莫展:看題懵逼半小時,Coding 只會按空格。
徹底搞懂這題后,就需要找到類似的題型,然后不斷的重復(fù)練習(xí):最小路徑和、整數(shù)拆分、完全平方數(shù)、解碼方法、不同路徑、不同路徑 II。
通過這些練習(xí),尋找題目中的共同點,為什么這類題型都可以這樣思考呢?
慢慢的,知道了最優(yōu)子結(jié)構(gòu)、狀態(tài)轉(zhuǎn)移方程、重疊子問題的概念,不知不覺動態(tài)規(guī)劃的知識點已經(jīng)掌握了 80%。
再遇到更高難度的動態(tài)規(guī)劃的題目時,心里也明白,一時半會沒做成無法就是最優(yōu)子結(jié)構(gòu)、狀態(tài)轉(zhuǎn)移方程、重疊子問題沒有理清楚。
這樣長期堅持下來,接觸新的題型時也可以從容不迫的思考。
后記
如果說成為大神有什么訣竅的話,那就是相信時間的力量,每天進(jìn)步一點就夠了!
-
算法
+關(guān)注
關(guān)注
23文章
4657瀏覽量
93969 -
leetcode
+關(guān)注
關(guān)注
0文章
20瀏覽量
2379
原文標(biāo)題:新手如何有效的刷算法題(LeetCode)
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
飛思卡爾三相無刷無感電路
EDA2俠客島難題挑戰(zhàn)·2025已正式開啟
有刷電機如何實現(xiàn)正反轉(zhuǎn)(可下載)
探索 MS37549 直流無刷馬達(dá)驅(qū)動方案的奧秘
發(fā)電機是無刷好還是有刷好
有刷電機和無刷電機的區(qū)別
直流有刷電機如何控制角度
思爾芯賽題正式發(fā)布,邀你共戰(zhàn)EDA精英挑戰(zhàn)賽!

BLDC電機控制算法詳解
空心杯電機是有刷還是無刷好
基于CW32的無刷直流空心杯電機無感方波控制驅(qū)動方案

無刷直流電機驅(qū)動單元

評論