leetcode 100 斬!回顧

leetcode 100 斬!從第 1 題開始,到如今也差很少快一年了,回顧記念一下。git

clipboard.png

爲何開始刷題?

從大一就知道了 leetcode,但刷題老是三天打魚,兩天曬網,會發現刷過的題,隔一段時間再看仍是須要好久才能再想起來,因而就萌發了刷一題總結一題的想法。github

另外一方面,leetcode 上的 discuss 裏一些解,有時候講解的不多,甚至只丟一些代碼,對於我等這種菜鳥有時候看的太廢勁了,因此不如本身把各類解法都理清楚,而後詳細的總結出來,也方便其餘人更好的理解。web

剛開始的感受

大一的時候,聽過 ACM,而後暑假也去學校的 ACM 集訓試了試,但當時基礎太差了,棧和隊列都不知道是什麼,因此也就沒有走上 ACM 的道路。以後就各類學安卓、web、後端的應用開發的一些東西了。後來準備開始刷題是大四畢業的時候了吧。算法

當時對回溯、動態規劃也都只是上課的時候學過,也並不熟練。開始幾題的時候,也都很慢,不少都本身想不出來。而後就去看別人的題解。看完之後,就什麼都不看,而後按本身的思路再寫一遍代碼。後端

尤爲是第 5 題,求最長迴文序列,如今都印象深入,記得當時用了好幾天才把全部解法總結了出來。微信

因此你們若是想刷題的話,也不用怕本身基礎很差,大不了哪些名詞不會就去查,一點點積累就能夠,重要的是開始和堅持。框架

如今的感受

從開始可能只是以爲該刷一刷題,到如今可能真的是愛上了刷題。工具

如今刷題基本能夠想出一種思路,有時候甚至和最優解想到了一塊兒,還會想出一些別人沒有想到的解法,這種成就感可能就是打遊戲超神的感受吧,哈哈。優化

此外,看 discuss 的時候,每當看到使人拍案稱奇的思路的時候,真的是讓人心曠神怡,開心的不得了,就像中了彩票同樣的開心,趕快去和同窗分享。spa

有時候也會看到一些讓人捧腹的評論,題目是輸入一個字符串,輸出全部可能的 ip 地址。

Input: "25525511135"
Output: ["255.255.11.135","255.255.111.35"]

clipboard.png

clipboard.png

刷題的收穫

在總結的過程當中,由於力求給他人講懂,在理清思路的動機的過程當中,會發現以前的想法多是錯的,會總結着總結着就明白了另外一種解法,或者產生新的想法,或者明白各個解法相互之間的聯繫,會比僅僅 AC 多出不少收穫。

從理清他人的想法,再到本身寫出代碼,再到把各個解法用本身的理解串起來,會有一種「紙上得來終覺淺,絕知此事要躬行」的感受。有時候雖然大的框架有了,可是小的細節方面仍是須要本身去體會。爲何加這個 if?爲何是小於等於?每一句代碼的產生都是有緣由的,毫不會是無關緊要的代碼。

因此雖然一道題從看題,理解,本身考慮,看別人解法,到從新實現,再到總結出來,可能須要 三、4 個小時,甚至 五、6 個小時或者更多,但我以爲是值得的。

此外,也有不少人加本身的微信過來亦或是感謝本身,亦或是指出錯誤,亦或是詢問問題,亦或是沒說過話的,哈哈。有微軟、谷歌、百度、阿里、騰訊的大佬,有各個大學的學生,甚至巧的是還能加上高中的校友,世界真小,哈哈。

clipboard.png

clipboard.png

clipboard.png

clipboard.png

上邊是最近加的一些人,每次收到別人的稱讚本身也會很開心。此外,博客是直接放在 github 上的,目前也有 280 stars 了,是本身 github 上 start 數最多的項目了,說來也慚愧,但願之後本身努力能夠有一個好的開源項目。

刷題的理解

一些人可能會糾結用什麼語言去刷,其實不必糾結的。刷題須要考慮的是算法,而不是語言。算法就像是從家裏到超市該怎麼走?出門左拐,右拐直走….而語言是咱們選擇的交通工具,騎車?步行?開車?平衡車?每種交通工具都有本身的優勢和缺點,語言也是如此。而好的算法可能更像是,咱們偶然發現了一條近路,下降了咱們的時間複雜度或者是空間複雜度。

刷了 100 道題了,我以爲必需要掌握的就是遞歸的思想了,利用這個思想能夠解大部分的題了。計算機擅長的就是記憶以及速度,而遞歸能夠把這兩個優點發揮到極致。遇到問題之後,咱們能夠考慮如何把大問題分解成小問題,想出來之後,代碼很容易就出來了。

此外,一些遞歸能夠用動態規劃的思想改寫,從而優化遞歸壓棧所消耗的時間,遞歸是頂部到底部再回到頂部,而動態規劃經過存儲,直接從底部到頂部解決問題。

最經典的例子就是斐波那契數列了,求第 n 項數列的值。

斐波那契數列,指的是這樣一個數列:一、一、二、三、五、八、1三、2一、34 …… 在數學上,斐波納契數列定義以下:F ( 0 ) = 0,F ( 1 ) = 1 , F ( n ) = F ( n - 1 ) + F ( n - 2 )(n >= 2,n ∈ N*);

若是用遞歸的思想去寫,代碼簡潔而優雅。

long Fibonacci(int n){
   if (n == 0)
        return 0;
   else if (n == 1)
        return 1;
   else
       return Fibonacci(n-1) + Fibonacci(n-2);
}

固然,這樣的話太慢了,優化的話,就是把遞歸過程的結果保存起來,或者就是改寫成動態規劃,最強的是實際上是有一個公式的,直接利用公式就能夠。

此外,還有一些題目就是根據題目的理解去寫代碼了,沒有什麼特殊的技巧。

將來的打算

固然是繼續刷下去了,很開心,天天不刷一刷題會不習慣的,但願你們也早日感覺到刷題的樂趣,哈哈。

在線地址:https://leetcode.wang,域名也比較好記,但願對你們會有幫助。

我是用 gitbook 搭建的,我以爲上邊「搜索」的插件很好用,能夠直接根據關鍵字搜出來本身想作的題。

clipboard.png

知乎專欄也會同步更新:https://zhuanlan.zhihu.com/le...

越努力,越幸運,共勉。

相關文章
相關標籤/搜索