<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          新手如何有效的刷算法題(LeetCode)

          共 2072字,需瀏覽 5分鐘

           ·

          2020-07-31 18:40


          來源:五分鐘學(xué)算法



          前言

          作為一名非科班出身的程序員,我是參加工作之后才開始接觸算法,學(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)過不斷的摸索與試驗,形成了自己的一套刷題路徑。

          1. 自己的解法

          2. 網(wǎng)上好的解法

          3. 自己的解法可以優(yōu)化的地方

          4. 不停的優(yōu)化

          5. 尋找相同的題型

          6. 總結(jié)

          每一個題目都經(jīng)過至少一遍這樣的迭代,徹底吃透一道題進而掌握一種題型。

          以一道極其簡單的動態(tài)規(guī)劃題為例 ,LeetCode 第 70 號問題:爬樓梯。

          當(dāng)時的我根本不知道動態(tài)規(guī)劃的相關(guān)概念,什么狀態(tài),什么轉(zhuǎn)移方程,通通沒聽過。

          沒錯,當(dāng)時就那么菜!

          二話不說,直接使用暴力解法。

          class Solution {    public int climbStairs(int n) {        return calcWays(n);    }    private int calcWays( int n ){        if ( n == 1) return 1;        if ( n == 2) return 2;        return calcWays(n-1) + calcWays(n-2);    }}

          很明顯,無腦的遞歸暴力解法包含了大量的重復(fù)計算,提交上去直接標(biāo)紅提示超出時間限制

          后來看了網(wǎng)上高票答案的分析,知道了備忘錄的概念,于是很容易寫出優(yōu)化后的代碼。

          //采用備忘錄的方式來存子問題的解以避免大量的重復(fù)計算
          class Solution { int[] memo; public int climbStairs(int n) { memo = new int[n+1]; return calcWays(n); } private int calcWays( int n ){ if ( n == 1) return 1; if ( n == 2) return 2; if (memo[n] == 0) memo[n] = calcWays(n-1) + calcWays(n-2); return memo[n]; }
          }

          再后來,發(fā)現(xiàn)備忘錄是自頂 向下的方式,稍許變動,修改為自低 向上的遞推方式就是動態(tài)規(guī)劃的形式。

          class Solution {
          public int climbStairs(int n) { int[] memo = new int[n+1]; memo[0] = 1; memo[1] = 1;
          for(int i = 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)移方程、重疊子問題沒有理清楚。

          這樣長期堅持下來,接觸新的題型時也可以從容不迫的思考。

          后記

          如果說成為大神有什么訣竅的話,那就是相信時間的力量,每天進步一點就夠了!

          python爬蟲人工智能大數(shù)據(jù)公眾號

          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄网大全在线观看 | 国产美女全裸网站 | 超碰欧美老妇 | 西西444WWW无码大胆知乎 | 性生活片无码在线 |