算法學(xué)習(xí)之路

-----------

之前發(fā)的那篇關(guān)于框架性思維的文章虑省,我也發(fā)到了不少其他圈子,受到了大家的普遍好評县忌,這一點我真的沒想到掂榔,首先感謝大家的認(rèn)可,我會更加努力症杏,寫出通俗易懂的算法文章装获。

有很多朋友問我數(shù)據(jù)結(jié)構(gòu)和算法到底該怎么學(xué),尤其是很多朋友說自己是「小白」鸳慈,感覺這些東西好難啊饱溢,就算看了之前的「框架思維」喧伞,也感覺自己刷題乏力走芋,希望我能聊聊我從一個非科班小白一路是怎么學(xué)過來的绩郎。

首先要給懷有這樣疑問的朋友鼓掌,因為你現(xiàn)在已經(jīng)「知道自己不知道」翁逞,而且開始嘗試學(xué)習(xí)肋杖、刷題、尋求幫助挖函,能做到這一點本身就是及其困難的状植。

關(guān)于「框架性思維」,對于一個小白來說怨喘,可能暫時無法完全理解(如果你能理解津畸,說明你水平已經(jīng)不錯啦,不是小白啦)必怜。就像軟件工程肉拓,對于我這種沒帶過項目的人來說,感覺其內(nèi)容枯燥乏味梳庆,全是廢話暖途,但是對于一個帶過團隊的人,他就會覺得軟件工程里的每一句話都是精華膏执。暫時不太理解沒關(guān)系驻售,留個印象,功夫到了很快就明白了更米。

下面寫一寫我一路過來的一些經(jīng)驗欺栗。如果你已經(jīng)看過很多「如何高效刷題」「如何學(xué)習(xí)算法」的文章,卻還是沒有開始行動并堅持下去征峦,本文的第五點就是寫給你的纸巷。

我覺得之所以有時候認(rèn)為自己是「小白」,是由于知識某些方面的空白造成的眶痰。具體到數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)瘤旨,無非就是兩個問題搞得不太清楚:這是啥?有啥用竖伯?

舉個例子存哲,比如說你看到了「棧」這個名詞七婴,老師可能會講這些關(guān)鍵詞:先進后出祟偷、函數(shù)堆棧等等。但是打厘,對于初學(xué)者修肠,這些描述屬于文學(xué)詞匯,沒有實際價值户盯,沒有解決最基本的兩個問題嵌施。如何回答這兩個基本問題呢饲化?回答「這是啥」需要看教科書,回答「有啥用」需要刷算法題吗伤。

PS:我認(rèn)真寫了 100 多篇原創(chuàng)吃靠,手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄足淆,持續(xù)更新巢块。建議收藏,按照我的文章順序刷題巧号,掌握各種算法套路后投再入題海就如魚得水了族奢。

一、這是啥丹鸿?

這個問題最容易解決歹鱼,就像一層窗戶紙,你只要隨便找本書看兩天卜高,自己動手實現(xiàn)一個「隊列」「椕忠觯」之類的數(shù)據(jù)結(jié)構(gòu),就能捅破這層窗戶紙掺涛。

這時候你就能理解「框架思維」文章中的前半部分了:數(shù)據(jù)結(jié)構(gòu)無非就是數(shù)組庭敦、鏈表為骨架的一些特定操作而已;每個數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的功能無非增刪查改罷了薪缆。

比如說「列隊」這個數(shù)據(jù)結(jié)構(gòu)秧廉,無非就是基于數(shù)組或者鏈表,實現(xiàn) enqueue 和 dequeue 兩個方法拣帽。這兩個方法就是增和刪呀疼电,連查和改的方法都不需要。

二减拭、有啥用蔽豺?

解決這個問題,就涉及算法的設(shè)計了拧粪,是個持久戰(zhàn)修陡,需要經(jīng)常進行抽象思考,刷算法題可霎,培養(yǎng)「計算機思維」魄鸦。

之前的文章講了,算法就是對數(shù)據(jù)結(jié)構(gòu)準(zhǔn)確而巧妙的運用癣朗。常用算法問題也就那幾大類拾因,算法題無非就是不斷變換場景,給那幾個算法框架套上不同的皮。刷題绢记,就是在鍛煉你的眼力扁达,看你能不能看穿問題表象揪出相應(yīng)的解法框架。

比如說庭惜,讓你求解一個迷宮罩驻,你要把這個問題層層抽象:迷宮 -> 圖的遍歷 -> N 叉樹的遍歷 -> 二叉樹的遍歷穗酥。然后讓框架指導(dǎo)你寫具體的解法护赊。

抽象問題,直擊本質(zhì)砾跃,是刷題中你需要刻意培養(yǎng)的能力骏啰。

三、如何看書

直接推薦一本公認(rèn)的好書抽高,《算法第 4 版》判耕,我一般簡寫成《算法4》。不要蜻蜓點水翘骂,這本書你能選擇性的看上 50%壁熄,基本上就達到平均水平了。別怕這本書厚碳竟,因為起碼有三分之一不用看草丧,下面講講怎么看這本書。

看書仍然遵循遞歸的思想:自頂向下莹桅,逐步求精昌执。

這本書知識結(jié)構(gòu)合理,講解也清楚诈泼,所以可以按順序?qū)W習(xí)懂拾。書中正文的算法代碼一定要親自敲一遍,因為這些真的是扎實的基礎(chǔ)铐达,要認(rèn)真理解岖赋。不要以為自己看一遍就看懂了,不動手的話理解不了的瓮孙。但是贾节,開頭部分的基礎(chǔ)可以酌情跳過;書中的數(shù)學(xué)證明衷畦,如不影響對算法本身的理解栗涂,完全可以跳過;章節(jié)最后的練習(xí)題祈争,也可以全部跳過斤程。這樣一來,這本書就薄了很多。

相信讀者現(xiàn)在已經(jīng)認(rèn)可了「框架性思維」的重要性忿墅,這種看書方式也是一種框架性策略扁藕,抓大放小,著重理解整體的知識架構(gòu)疚脐,而忽略證明亿柑、練習(xí)題這種細(xì)節(jié)問題,即保持自己對新知識的好奇心棍弄,避免陷入無限的細(xì)節(jié)被勸退望薄。

當(dāng)然,《算法4》到后面的內(nèi)容也比較難了呼畸,比如那幾個著名的串算法痕支,以及正則表達式算法。這些屬于「經(jīng)典算法」蛮原,看個人接受能力吧卧须,單說刷 LeetCode 的話,基本用不上儒陨,量力而行即可花嘶。

四、如何刷題

首先聲明一下蹦漠,算法和數(shù)學(xué)水平?jīng)]關(guān)系椭员,和編程語言也沒關(guān)系,你愛用什么語言用什么津辩。算法拆撼,主要是培養(yǎng)一種新的思維方式。所謂「計算機思維」喘沿,就跟你考駕照一樣闸度,你以前騎自行車,有一套自行車的規(guī)則和技巧蚜印,現(xiàn)在你開汽車莺禁,就需要適應(yīng)并練習(xí)開汽車的規(guī)則和技巧。

LeetCode 上的算法題和前面說的「經(jīng)典算法」不一樣窄赋,我們權(quán)且稱為「解悶算法」吧哟冬,因為很多題目都比較有趣,有種在做奧數(shù)題或者腦筋急轉(zhuǎn)彎的感覺忆绰。比如說浩峡,讓你用隊列實現(xiàn)一個棧,或者用棧實現(xiàn)一個隊列错敢,以及不用加號做加法翰灾,開腦洞吧?

當(dāng)然,這些問題雖然看起來無厘頭纸淮,實際生活中也用不到平斩,但是想解決這些問題依然要靠數(shù)據(jù)結(jié)構(gòu)以及對基礎(chǔ)知識的理解,也許這就是很多公司面試都喜歡出這種「智力題」的原因咽块。下面說幾點技巧吧绘面。

盡量刷英文版的 LeetCode,中文版的“力扣”是閹割版侈沪,不僅很多題目沒有答案揭璃,而且連個討論區(qū)都沒有。英文版的是真的很良心了峭竣,很多問題都有官方解答塘辅,詳細(xì)易懂晃虫。而且討論區(qū)(Discuss)也沉淀了大量優(yōu)質(zhì)內(nèi)容皆撩,甚至好過官方解答。真正能打開你思路的哲银,很可能是討論區(qū)各路大神的思路薈萃扛吞。

PS:如果有的英文題目實在看不懂,有個小技巧荆责,你在題目頁面的 url 里加一個 -cn滥比,即 https://leetcode.com/xxx 改成 https://leetcode-cn.com/xxx,這樣就能切換到相應(yīng)的中文版頁面查看做院。

對于初學(xué)者盲泛,強烈建議從 Explore 菜單里最下面的 Learn 開始刷,這個專題就是專門教你學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和基本算法的键耕,教學(xué)篇和相應(yīng)的練習(xí)題結(jié)合寺滚,不要太良心。

最近 Learn 專題里新增了一些內(nèi)容屈雄,我們挑數(shù)據(jù)結(jié)構(gòu)相關(guān)的內(nèi)容刷就行了村视,像 Ruby,Machine Learning 就沒必要刷了酒奶。刷完 Learn 專題的基礎(chǔ)內(nèi)容蚁孔,基本就有能力去 Explore 菜單的 Interview 專題刷面試題,或者去 Problem 菜單惋嚎,在真正的題海里遨游了杠氢。

無論刷 Explore 還是 Problems 菜單,最好一個分類一個分類的刷另伍,不要蜻蜓點水鼻百。比如說這幾天就刷鏈表,刷完鏈表再去連刷幾天二叉樹。這樣做是為了幫助你提取「框架」愕宋。一旦總結(jié)出針對一類問題的框架玻靡,解決同類問題可謂是手到擒來。

五中贝、道理我都懂囤捻,還是不能堅持下去

這其實無關(guān)算法了,還是老生常談的執(zhí)行力的問題邻寿。不說什么破雞湯了蝎土,我覺得解決辦法就是「激起欲望」,注意我說的是欲望绣否,而不是常說的興趣誊涯,拿我自己說說吧。

PS:我認(rèn)真寫了 100 多篇原創(chuàng)蒜撮,手把手刷 200 道力扣題目暴构,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新段磨。建議收藏取逾,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了苹支。

半年前我開始刷題砾隅,目的和大部分人都一樣的,就是為畢業(yè)找工作做準(zhǔn)備债蜜。只不過晴埂,大部分人是等到臨近畢業(yè)了才開始刷,而我離畢業(yè)還有一陣子寻定。這不是炫耀我多有覺悟儒洛,而是我承認(rèn)自己的極度平凡。

首先特姐,我真的想找到一份不錯的工作(誰都想吧晶丘?),我想要高薪呀唐含!否則我在朋友面前浅浮,女神面前放下的騷話,最終都會反過來啪啪地打我的臉捷枯。我也是要恰飯滚秩,要面子,要虛榮心的嘛淮捆。賺錢郁油,虛榮心本股,足以激起我的欲望了。

但是桐腌,我不擅長 deadline 突擊拄显,我理解東西真的慢,所以干脆笨鳥先飛了案站。智商不夠躬审,拿時間來補,我沒能力兩個月突擊蟆盐,干脆拉長戰(zhàn)線承边,打他個兩年游擊戰(zhàn),我還不信耗不死算法這個強敵石挂。事實證明救军,你如果認(rèn)真學(xué)習(xí)一個月称诗,就能夠取得肉眼可見的進步了膀懈。

現(xiàn)在入篮,我依然在堅持刷題,而且為了另外一個原因里伯,這個公眾號城瞎。我沒想到自己的文字竟然能夠幫助到他人渤闷,甚至能得到認(rèn)可疾瓮。這也是虛榮心啊,我不能讓讀者失望啊飒箭,我想讓更多的人認(rèn)可(夸)我呀狼电!

以上,不光是堅持刷算法題吧弦蹂,很多場景都適用肩碟。執(zhí)行力是要靠「欲望」支撐的,我也是一凡人凸椿,只有那些看得見摸得著的東西才能使我快樂呀削祈。讀者不妨也嘗試把刷題學(xué)習(xí)和自己的切身利益聯(lián)系起來,這恐怕是堅持下去最簡單直白的理由了脑漫。

_____________

我的 在線電子書 有 100 篇原創(chuàng)文章髓抑,手把手帶刷 200 道力扣題目,建議收藏优幸!對應(yīng)的 GitHub 算法倉庫 已經(jīng)獲得了 70k star吨拍,歡迎標(biāo)星!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末网杆,一起剝皮案震驚了整個濱河市羹饰,隨后出現(xiàn)的幾起案子伊滋,更是在濱河造成了極大的恐慌,老刑警劉巖队秩,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑旺,死亡現(xiàn)場離奇詭異,居然都是意外死亡馍资,警方通過查閱死者的電腦和手機燥撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迷帜,“玉大人物舒,你說我怎么就攤上這事∠非拢” “怎么了冠胯?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锦针。 經(jīng)常有香客問我荠察,道長,這世上最難降的妖魔是什么奈搜? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任悉盆,我火速辦了婚禮,結(jié)果婚禮上馋吗,老公的妹妹穿的比我還像新娘焕盟。我一直安慰自己,他們只是感情好宏粤,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布脚翘。 她就那樣靜靜地躺著,像睡著了一般绍哎。 火紅的嫁衣襯著肌膚如雪来农。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天崇堰,我揣著相機與錄音沃于,去河邊找鬼。 笑死海诲,一個胖子當(dāng)著我的面吹牛繁莹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饿肺,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蒋困,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬辣?” 一聲冷哼從身側(cè)響起雪标,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤零院,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后村刨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體告抄,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年嵌牺,在試婚紗的時候發(fā)現(xiàn)自己被綠了打洼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逆粹,死狀恐怖募疮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僻弹,我是刑警寧澤阿浓,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蹋绽,受9級特大地震影響芭毙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卸耘,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一退敦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚣抗,春花似錦侈百、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至两蟀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震缭,已是汗流浹背赂毯。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣宰,地道東北人党涕。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像巡社,于是被迫代替她去往敵國和親膛堤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容