摘要:斬從第題開始,到現在也差不多快一年了,回顧紀念一下。當時對回溯動態規劃也都只是上課的時候學過,也并不熟練。最經典的例子就是斐波那契數列了,求第項數列的值。
leetcode 100 斬!從第 1 題開始,到現在也差不多快一年了,回顧紀念一下。
為什么開始刷題?從大一就知道了 leetcode,但刷題總是三天打魚,兩天曬網,會發現刷過的題,隔一段時間再看還是需要很久才能再想起來,于是就萌發了刷一題總結一題的想法。
另一方面,leetcode 上的 discuss 里一些解,有時候講解的很少,甚至只丟一些代碼,對于我等這種菜鳥有時候看的太廢勁了,所以不如自己把各種解法都理清楚,然后詳細的總結出來,也方便其他人更好的理解。
剛開始的感覺大一的時候,聽過 ACM,然后暑假也去學校的 ACM 集訓試了試,但當時基礎太差了,棧和隊列都不知道是什么,所以也就沒有走上 ACM 的道路。之后就各種學安卓、web、后端的應用開發的一些東西了。后來準備開始刷題是大四畢業的時候了吧。
當時對回溯、動態規劃也都只是上課的時候學過,也并不熟練。開始幾題的時候,也都很慢,很多都自己想不出來。然后就去看別人的題解。看完以后,就什么都不看,然后按自己的思路再寫一遍代碼。
尤其是第 5 題,求最長回文序列,現在都印象深刻,記得當時用了好幾天才把所有解法總結了出來。
所以大家如果想刷題的話,也不用怕自己基礎不好,大不了哪些名詞不會就去查,一點點積累就可以,重要的是開始和堅持。
現在的感覺從開始可能只是覺得該刷一刷題,到現在可能真的是愛上了刷題。
現在刷題基本可以想出一種思路,有時候甚至和最優解想到了一起,還會想出一些別人沒有想到的解法,這種成就感可能就是打游戲超神的感覺吧,哈哈。
此外,看 discuss 的時候,每當看到令人拍案稱奇的思路的時候,真的是讓人心曠神怡,開心的不得了,就像中了彩票一樣的開心,趕快去和同學分享。
有時候也會看到一些讓人捧腹的評論,題目是輸入一個字符串,輸出所有可能的 ip 地址。
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){ if (n == 0) return 0; else if (n == 1) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); }
當然,這樣的話太慢了,優化的話,就是把遞歸過程的結果保存起來,或者就是改寫成動態規劃,最強的是其實是有一個公式的,直接利用公式就可以。
此外,還有一些題目就是根據題目的理解去寫代碼了,沒有什么特殊的技巧。
未來的打算當然是繼續刷下去了,很開心,每天不刷一刷題會不習慣的,希望大家也早日感受到刷題的樂趣,哈哈。
在線地址:https://leetcode.wang,域名也比較好記,希望對大家會有幫助。
我是用 gitbook 搭建的,我覺得上邊「搜索」的插件很好用,可以直接根據關鍵字搜出來自己想做的題。
知乎專欄也會同步更新:https://zhuanlan.zhihu.com/le...。
越努力,越幸運,共勉。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75366.html
摘要:極簡爬蟲攻防戰紀要爬蟲是構建搜索引擎的基礎負責抓取網頁信息并對網頁識別分類及過濾。爬蟲方終于鎖定了第一場戰役的勝局由于斷崖式技術的出現,反爬方在瀏覽器識別戰役上望風披靡。經過反爬方的精心運作,逐漸有效削弱了敵方的攻勢。 極簡爬蟲攻防戰紀要 ? ??爬蟲是構建搜索引擎的基礎, 負責抓取網頁信息并對網頁識別、分類及過濾。我們熟識的電商、搜索、新聞及各大門戶網站都有強大的爬蟲集群在每...
摘要:寫在前面今天這篇文章是貪心算法系列的第三篇劃分字母區間。前文回顧貪心算法分發糖果刷題匯總匯總貼今日題目字符串由小寫字母組成。返回一個表示每個字符串片段的長度的列表。示例輸入輸出解釋劃分結果為。每個字母最多出現在一個片段中。 寫在前面 今天這篇文章是貪心算法系列的第三篇--劃分字母區間。 前文回顧: 【LeetCode】貪心算法--分發糖果(135) 刷題匯總: 【LeetCode】匯總...
摘要:題目給定一個二維網格和一個單詞,找出該單詞是否存在于網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中相鄰單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 題目 給定一個二維網格和一個單詞,找出該單詞是否存在于網格中。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中相鄰單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允...
摘要:題目給定一個二維網格和一個單詞,找出該單詞是否存在于網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中相鄰單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 題目 給定一個二維網格和一個單詞,找出該單詞是否存在于網格中。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中相鄰單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允...
摘要:我記得大三參加騰訊的校招面試時只準備了幾種常見的排序算法就足以應對了,然而今年包括今日頭條在內的多家大廠的前端筆試題目中都出現了貪心算法動態規劃分治算法等進階性的算法題目。本篇博客參考今日頭條銀國徽老師的《js版數據結構與算法》Part1改編自《漫畫算法》原作者:程序員小灰前言眾所周知,與后臺開發人員相比,算法是我們前端開發人員的一個弱項。而近兩年隨著互聯網行業競爭愈發激烈,市場上對前端崗位...
閱讀 1986·2019-08-30 15:54
閱讀 3539·2019-08-30 15:52
閱讀 1827·2019-08-29 17:20
閱讀 2520·2019-08-29 17:08
閱讀 2349·2019-08-26 13:24
閱讀 790·2019-08-26 11:59
閱讀 2785·2019-08-23 14:50
閱讀 617·2019-08-23 14:20