以下文字**自:
leetcode 100 斬!從第 1 題開始,到現在也差不多快一年了,回顧紀念一下。
為什麼開始刷題?
從大一就知道了 leetcode,但刷題總是三天打魚,兩天曬網,會發現刷過的題,隔一段時間再看還是需要很久才能再想起來,於是就萌發了刷一題總結一題的想法。
另一方面,leetcode 上的 discuss 裡一些解,有時候講解的很少,甚至只丟一些**,對於我等這種菜鳥有時候看的太廢勁了,所以不如自己把各種解法都理清楚,然後詳細的總結出來,也方便其他人更好的理解。
剛開始的感覺
大一的時候,聽過 acm,然後暑假也去學校的 acm 集訓試了試,但當時基礎太差了,棧和佇列都不知道是什麼,所以也就沒有走上 acm 的道路。之後就各種學安卓、web、後端的應用開發的一些東西了。後來準備開始刷題是大四畢業的時候了吧。
當時對回溯、動態規劃也都只是上課的時候學過,也並不熟練。開始幾題的時候,也都很慢,很多都自己想不出來。然後就去看別人的題解。看完以後,就什麼都不看,然後按自己的思路再寫一遍**。
尤其是第 5 題,求最長回文序列,現在都印象深刻,記得當時用了好幾天才把所有解法總結了出來。
所以大家如果想刷題的話,也不用怕自己基礎不好,大不了哪些名詞不會就去查,一點點積累就可以,重要的是開始和堅持。
現在的感覺
從開始可能只是覺得該刷一刷題,到現在可能真的是愛上了刷題。
現在刷題基本可以想出一種思路,有時候甚至和最優解想到了一起,還會想出一些別人沒有想到的解法,這種成就感可能就是打遊戲超神的感覺吧,哈哈。
此外,看 discuss 的時候,每當看到令人拍案稱奇的思路的時候,真的是讓人心曠神怡,開心的不得了,就像中了彩票一樣的開心,趕快去和同學分享。
input: "25525511135"
output: ["255.255.11.135","255.255.111.35"]
刷題的收穫
在總結的過程中,因為力求給他人講懂,在理清思路的動機的過程中,會發現之前的想法可能是錯的,會總結著總結著就明白了另一種解法,或者產生新的想法,或者明白各個解法相互之間的聯絡,會比僅僅 ac 多出很多收穫。
從理清他人的想法,再到自己寫出**,再到把各個解法用自己的理解串起來,會有一種「紙上得來終覺淺,絕知此事要躬行」的感覺。有時候雖然大的框架有了,但是小的細節方面還是需要自己去體會。為什麼加這個 if?為什麼是小於等於?每一句**的產生都是有原因的,絕不會是可有可無的**。
所以雖然一道題從看題,理解,自己考慮,看別人解法,到重新實現,再到總結出來,可能需要 3、4 個小時,甚至 5、6 個小時或者更多,但我覺得是值得的。
上邊是最近加的一些人,每次收到別人的稱讚自己也會很開心。此外,部落格是直接放在 github 上的,目前也有 280 stars 了,是自己 github 上 start 數最多的專案了,說來也慚愧,希望以後自己努力可以有乙個好的開源專案。
刷題的理解
一些人可能會糾結用什麼語言去刷,其實沒必要糾結的。刷題需要考慮的是演算法,而不是語言。演算法就像是從家裡到超市該怎麼走?出門左拐,右拐直走....而語言是我們選擇的交通工具,騎車?步行?開車?平衡車?每種交通工具都有自己的優點和缺點,語言也是如此。而好的演算法可能更像是,我們偶然發現了一條近路,降低了我們的時間複雜度或者是空間複雜度。
刷了 100 道題了,我覺得必須要掌握的就是遞迴的思想了,利用這個思想可以解大部分的題了。計算機擅長的就是記憶以及速度,而遞迴可以把這兩個優勢發揮到極致。遇到問題以後,我們可以考慮如何把大問題分解成小問題,想出來以後,**很容易就出來了。
此外,一些遞迴可以用動態規劃的思想改寫,從而優化遞迴壓棧所消耗的時間,遞迴是頂部到底部再回到頂部,而動態規劃通過儲存,直接從底部到頂部解決問題。
最經典的例子就是斐波那契數列了,求第 n 項數列的值。
斐波那契數列,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34 …… 在數學上,斐波納契數列定義如下:f ( 0 ) = 0,f ( 1 ) = 1 , f ( n ) = f ( n - 1 ) + f ( n - 2 )(n >= 2,n ∈ n*);
如果用遞迴的思想去寫,**簡潔而優雅。
long fibonacci(int n)
當然,這樣的話太慢了,優化的話,就是把遞迴過程的結果儲存起來,或者就是改寫成動態規劃,最強的是其實是有乙個公式的,直接利用公式就可以。
此外,還有一些題目就是根據題目的理解去寫**了,沒有什麼特殊的技巧。
未來的打算
當然是繼續刷下去了,很開心,每天不刷一刷題會不習慣的,希望大家也早日感受到刷題的樂趣,哈哈。
我是用 gitbook 搭建的,我覺得上邊「搜尋」的外掛程式很好用,可以直接根據關鍵字搜出來自己想做的題。
知乎專欄也會同步更新:
越努力,越幸運,共勉。
Leetcode刷題經驗
該題可以很輕易地看出來是使用回溯 排序,排序是為了更好地剪枝。解題思路 假設輸入為can dida tes 2,3 6,7 ta rget 7。candidates 2,3,6,7 target 7。candid ates 2,3,6,7 t arge t 7。依次拿出can dida tescan...
leetcode刷題指北(2)
9.回文數 判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 思路一 第一反應轉為字串,遍歷字串首尾是否相等。class solution return true 也可以使用字串反轉比較 class solution el...
leetcode刷題筆記 2
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...