算法題做到崩潰?刷了幾千道算法題,關於如何刷題有些話我想對你說

作者 | Rocky0429
來源 | Python空間


大家好,我是 Rocky0429,一個曾經在 ACM 界划水多年的蒟蒻


在“刷了幾千道算法題,這些我私藏的刷題網站都在這裏了!”這篇文章中,我有說過要寫一篇如何刷題的文章,然而好幾個月過去了,我實在沒法舔着臉繼續拖下去了…


所以,我來交作業了…


在這裏插入圖片描述

我好多次在想要如何寫這篇文章,試圖去回想我刷題的時光,當時的種種感覺拼接起來,一次次動筆,又一次次的放棄。


其實諸多糾結,我試圖遵循常規,將這種刷題經驗公式化,列個一二三四,期間穿插一些算法題來 give an example,這樣好像纔是真正像是經驗的樣子,但我總覺的哪裏奇怪。


我問自己,當年還是個小白,對刷題一無所知的我是否想要去看這樣的文章,我想答案應該是不會…


在這裏插入圖片描述

所以這篇文章我可能會寫成自己想寫的樣子,它不會教你速成,沒有捷徑,單純是一個當年機緣巧合入了 ACM 的混子,有一段很長的(三年)連續刷題的時間,恰好有一點自己感想的碎碎念。


以下僅代表個人想法…


在這裏插入圖片描述


很多人開始他的刷題之路因爲各種各樣的原因:進大廠、研究生複試或者參加競賽拿牌,當然也可能是因爲喜歡。其實不管你抱着何種目的開始,我希望你能一直在刷題這條路上走下去,畢竟除了提高自己解決問題和寫代碼的能力這種顯而易見的好處,也能當作無聊時候的一種消遣…


在這裏插入圖片描述


其實隨着刷題的深入,我發現刷題其實就是分爲兩步,第一步有思路,即知道用哪種姿勢怎麼解題;第二步是實現,即將你的思路轉化爲代碼。接下來我所有的廢話都是圍繞這兩步來展開。


在這裏插入圖片描述



0x01 有思路


先說第一步:有思路。


算法題刷多了,你就會發現,最後其實在你腦子裏記住的不是實現這道題的代碼,而是解這道題的思路。


當我們刷了幾百道幾千道算法題的時候,你不可能記住每道題的代碼,但是你可能知道這道題的思路,也就是出現類似“這道題我見過,我知道用這樣那樣的方法可以做出來”。有了思路,其實把它實現出來就是自然而然的事兒了,當然可能有人說知道了思路也不知道怎麼實現,現在我先不說,這是我們下一步要講的問題。


在這裏插入圖片描述


上面說的是我們要走到的目的地,那如何走上這條路,從而到刷題刷到思路“泉湧”呢?其實很簡單,我們從小到大一直在被動習慣的四個字:題海戰術。


在這裏插入圖片描述


題海戰術,說白了就是多刷題,見多才能識廣。


但這裏的多刷題,不是指多瞎刷題,而是有方法的去刷。至於刷題的網站我已經在文章的開頭放鏈接了,不知道去哪找題的可以看一下。


首先說什麼是瞎刷題,就是看到一道刷一道,這是很多剛開始刷題的同學容易犯的毛病。


有的追求數量,刷了一堆簡單題,沉迷在 AC 的快感中不能自拔,在深深的自我感動中依然菜的扣腳;

有的追求無腦,看到一道題就去網上搜答案,以爲會解決問題,實則搜到了還看不懂,正好一勞永逸,給自己下了不是這塊料的斷言,成功的做到了開始即結束。


別問我爲什麼知道,我纔不會告訴你當年我就是這樣…


在這裏插入圖片描述


其實怎麼用正確的題海戰術,在我看來,其實也還是兩步,第一步多題一解,第二步一題多解。


當然在此之前,我覺得你得先搞明白什麼是時間複雜度和空間複雜度,不然不懂這些指標,你也不知道算法對於你當前題目的優劣。之前寫過一篇舊文,有興趣的可以看一下。


循序漸進帶你學習時間複雜度和空間複雜度。


0x01-1 多題一解


多題一解,就是把多種同類型的題先放在一起來做,也就是俗稱的刷專題。下面是我當年刷題的一部分分類的截圖:

在這裏插入圖片描述
在這裏插入圖片描述


很多大佬說做題要追求完美,一道題來 N 種姿勢,但是對於剛開始起步的同學來說,一道題帶着多解的思想包袱去刷,本身就是一種負擔。你很難指望初學者能一上來就一題多解,沒那麼多見識,腦闊裏沒儲備那麼多的算法類型,能夠暴力破解且跑通就已經是燒高香了。


在這裏插入圖片描述


這裏再多提一嘴,關於網上搜答案這件事,答案可以搜,但是不要上來一看題,感覺自己不會就立馬搜答案,要嘗試思考,多在草稿紙上寫寫畫畫,實在想不出來再去搜。


在這裏插入圖片描述


搜到的答案我不希望你去看別人的代碼,按照別人的代碼一步步的寫出來其實本身沒有多大意義,真正有意義的是別人的思路,通過別人的思路來自己實現出現,這纔是最應該做的。


這樣做的好處是,你可以很快了解一種類型題目的做題方法,加深對某類算法的理解,總結出做題的套路,這算是一種抽象的概括能力。很多時候你就會發現,題目不過是在某類解決辦法方面做加法減法。


在這裏插入圖片描述



0x01-2 一題多解


其實這個不用刻意去追求一題多解的能力,刷的專題多了,碰到的題目多了,自然而然你碰到一道題的時候腦袋裏就會有想法,覺的可以這樣做,也可以那樣做,這個時候你就可以對比不同的時間複雜度和空間複雜度,選擇當前的最優解法。


說一題多解,其實就是希望你在碰到一個問題的時候能夠多想一步,一步一步再一步,不同維度不同姿勢都嘗試一下。剛開始這可能比較難,畢竟這涉及到一個改變,因爲人都是有惰性的,畢竟只求一解比自找麻煩的求多解舒服多了…


在這裏插入圖片描述


題目見的多了你就會發現,很多時候你會碰到這種情況:A 題你有 5 種方法去解決它,改變它的某一個條件變成 B 題,作爲 A 題的相似題 B,可能這個時候你照搬 A 的解法來解決 B,你只剩下 3 種或者更少的解法可以解決 B 題,如果你只會 1 種解法,剛好這種解法失效,那你就只能再另想它法。


所以一題多解的好處也是顯而易見的,就相當於你的手裏多了很多的選項,選項多了不管你在面試或是其它時候,都能手裏有牌可打。


在這裏插入圖片描述


在這裏我又要多提一嘴,追求一題多解並不意味着“不擇手段”的追求題解數量的堆疊,也就是不要過分追求所謂奇淫技巧的解法,而這恰恰是許多同學容易犯的毛病,錯誤的認爲了奇淫技巧等於水平高超,在我看來這個除了能引來別人一句臥槽的驚訝,從而帶來一點內心虛榮心的滿足以外,其餘的用處不大,看個熱鬧就得了。畢竟魯迅先生曾經說過:“Use your best judgement”。


在這裏插入圖片描述


當然我也不是全盤否定技巧,但是你連個兩三百道題都沒刷完,你就在這給我講你要技巧,我會認爲你是在耍流氓…



0x02 實現


一道題有了思路,其實這道題的 90% 你已經解決了,把它實現出來按理來說就是自然而然的事兒了。


在這裏插入圖片描述


當然可能有同學知道了思路,但是就卡在這 10% 不知道怎麼實現上,那這就是你寫代碼的能力問題,其實一樣的,這就是不熟練,不熟練的原因就是練少了。


其實這個問題的唯一解還是所謂的“題海戰術”,多練習,唯手熟爾。


在這裏插入圖片描述


剛開始的時候不管是書上的例題,一些簡單的水題或者你想實現的一個簡單的東西,按照你的想法寫出來或者看一遍別人怎麼寫的,自己再一步一步的默敲,不要怕麻煩,一定要自己動手,不要看會了,我們都知道看會了其實不是真正的會。但是慢慢當你習慣了這種方式,你的代碼能力會潛移默化的變強。


在這裏插入圖片描述


別問我爲什麼知道,我難道要說作爲一個當年上了大學半年還沒寫過一次超過 20 行的代碼的男人,經過一個寒假以後,能切百十行代碼的題?


也太丟面兒了吧,說好的整個學霸人設呢…


在這裏插入圖片描述



0x03 第三步


咦?不是隻有兩步嘛,哪來的第三步?


嘿嘿,總得給能堅持看我說廢話看到這裏的同學開個小小竈不是…


在這裏插入圖片描述

其實還有兩點是我想說的,而且這兩點是我覺得在整個過程中最重要的。


0x03-1 做總結


怎麼說呢,做總結這件事的好處,誰做誰知道,不信你就試試…


在這裏插入圖片描述


每道題有每道題的總結,每種類型的題有某類題的總結,千萬不要怕麻煩,雖然剛開始的時候確實會很麻煩…


每每回想起來,我最後悔的就是在我剛開始刷題的時候沒有做總結。當年集訓隊老師告訴我們每道題做完都要把題解發布到 CSDN 上,記錄自己的思路,解題方式和代碼。這件事乍一聽我覺得太麻煩,覺得“有這個時間我多刷道題它不香嘛”,一直當作耳旁風。


在這裏插入圖片描述


後來真正開始在 CSDN 上發題解,並不是我突然頓悟,而是集訓隊老師看我們太懶,強制執行,然而這個強制,在經過初期的不適以後,慢慢的讓我形成了做什麼都要總結記錄的習慣,一下子就寫了 6 年。下面是剛開始的一些截圖:


在這裏插入圖片描述


習慣性梳理總結,在這個過程中重新產生更多的認識,理解更深,有更多的想法,無論後來成爲 CSDN 的博客專家(Rocky0429)或者後來開始寫公衆號(Python空間,id:Devtogether),都是因爲這種積累,我因此而獲益,對我們老師感激一生。


0x03-2 保持熱情


保持熱情,不僅僅是能堅持,而要在堅持上最好能帶有一點興趣。刷題真的是一個很漫長的過程,如何在這個過程中能堅持下去真的很難做到…


在這裏插入圖片描述


我覺得你最好有一個最終的目標,這個很多開始刷題的同學肯定都有,不然沒人閒着沒事找事去刷題,有了最終的目標朝着這個方向去努力,同時把這個過程分成一部分一部分,比如拿刷專題來說,我這段時間刷鏈表,下段時間刷貪心,再下段時間刷 dp…


將目標量化爲可衡量的每一段,自己有了掌控感,一步一步的向着最終的目標前進,知道自己離着還有多遠,不至於半途而廢。


拿我自己來說,當年搞 ACM,半年以後我已經準備放棄了,那段時間完全迷茫,覺得自己水平很差,沒有機會去參加比賽,不可能拿到獎牌。那段時間我開始去尋找別的出路,去參加 Python 的社團,準備轉去做項目。


渾渾噩噩了一圈,最後還是回去做 ACM,一方面是不想讓自己半年的努力付諸東流,對拿牌子的執念,更多的是我發現坐在那寫項目和做題比起來,我更喜歡 AC 的快感。


在這裏插入圖片描述



0x04 寫在之後


以上就是我的一點點經驗,其實沒有什麼新鮮的,有點囉嗦,也不一定能讓你有什麼進步。我一直覺的只要我們付出了時間和努力,開始向更好的方向邁出第一步,我們解決問題和寫代碼的能力就會潛移默化的提高。


在這個過程中,收穫的遠比去解決問題更有成就感,當然這種感同身受更多的需要你自己在這個過程中去體驗。


可能末了整篇文章最有價值的只有四個字 - 題海戰術。


希望你在變好的路上越走越遠…


在這裏插入圖片描述


另外本蒟蒻把公衆號的高分原創文章整理成了一本電子書,取名《Python修煉之道》,一共 400 頁!

具體內容請戳:熬夜爆肝整理 400 頁 《Python 修煉之道》,一本高分原創高清電子書送給你!

目錄如下:


在這裏插入圖片描述

現在免費送給大家,在我的公衆號Python空間(微信搜 Devtogether) 回覆 修煉之道即可獲取。



作者Info:

【作者】:Rocky0429
【原創公衆號】:Python空間。
【簡介】:CSDN 博客專家, 985 計算機在讀研究生,ACM 退役狗 & 亞洲區域賽銀獎划水選手。這是一個堅持原創的技術公衆號,每天堅持推送各種 Python 基礎/進階文章,數據分析,爬蟲實戰,數據結構與算法,不定期分享各類資源。
【福利】:送你新人大禮包一份,關注微信公衆號,後臺回覆:“CSDN” 即可獲取!
【轉載說明】:轉載請說明出處,謝謝合作!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章