序
關(guān)于 LeetCode
說到 LeetCode,作為一個(gè)程序員來說,應(yīng)該不陌生,近幾年參加面試都會(huì)提到它。國(guó)內(nèi)外的程序員用它刷題主要是為了面試。據(jù)歷史記載,這個(gè)網(wǎng)站 2011 年就成立了,馬上就要到自己 10 周年的生日了。每周舉行周賽,雙周賽,月賽,在有限時(shí)間內(nèi)編碼,確實(shí)非常能考驗(yàn)人的算法能力。一些大公司贊助冠名的比賽獲得前幾名除了有獎(jiǎng)品,還能直接拿到內(nèi)推的機(jī)會(huì)。
什么是 Cookbook
直譯的話就是烹飪書,教你做各種食譜美食的書。經(jīng)常看 O'Reilly 技術(shù)書的同學(xué)對(duì)這個(gè)名詞會(huì)很熟悉。一般動(dòng)手操作,實(shí)踐類的書都會(huì)有這個(gè)名字。

為什么會(huì)寫這個(gè)開源書
筆者刷題刷了一年了,想和大家分享分享一些做題心得,解題方法。想和有相同愛好的人交個(gè)朋友,一起交流學(xué)習(xí)。對(duì)于自己來說,寫題解也是一種提高。把一道深?yuàn)W的題目講給一點(diǎn)都沒有頭緒的人,并能讓他完全聽懂,很能鍛煉人的表達(dá)能力。在講解中很可能還會(huì)遇到聽者的一些提問,這些問題可能是自己的知識(shí)漏洞,強(qiáng)迫自己去彌補(bǔ)。筆者在公司做過相關(guān)的分享,感受很深,雙方受益都還不錯(cuò)。
另外,在大學(xué)期間,筆者做題的時(shí)候最討厭寫題解,感覺是浪費(fèi)時(shí)間,用更多的時(shí)間去做更多的題?,F(xiàn)在不知道算不算是“出來混的,總是要還的”。
關(guān)于書的封面
???O'Reilly 動(dòng)物書的同學(xué)一看這個(gè)封面就知道是向他們致敬。確實(shí)是這個(gè)目的。O'Reilly 的封面動(dòng)物都是稀缺動(dòng)物,并且畫風(fēng)都是黑白素描風(fēng)。這些動(dòng)物都有版權(quán)了,所以只能在網(wǎng)上找沒有版權(quán)的黑白素描風(fēng)的圖片。常見的能找到 40 張這種風(fēng)格的圖片。不過用的人太多了,筆者費(fèi)勁的找了其他幾張這種圖片,這張孔雀開屏是其中一張??兹搁_屏的意義是希望大家刷完 LeetCode 以后,提高了自身的算法能力,在人生的舞臺(tái)上開出自己的“屏”。全書配色也都是綠色,因?yàn)檫@是 AC 的顏色。
關(guān)于作者
筆者是一個(gè)剛剛?cè)胄幸荒臧氲?gopher 新人,還請(qǐng)各位大佬多多指點(diǎn)小弟我。大學(xué)參加了 3 年 ACM-ICPC,但是由于資質(zhì)不高,沒有拿到一塊金牌。所以在算法方面,我對(duì)自己的評(píng)價(jià)算是新手吧。參加 ACM-ICPC 最大的收獲是訓(xùn)練了思維能力,這種能力也會(huì)運(yùn)用到生活中。其次是認(rèn)識(shí)了很多國(guó)內(nèi)很聰明的選手,看到了自己和他們的差距。最后,就是那 200 多頁(yè),有些自己都沒有完全理解的,打印的密密麻麻的算法模板。知識(shí)學(xué)會(huì)了,終身都是自己的,沒有學(xué)會(huì),那些知識(shí)都是身外之物。
筆者從 2019 年 3 月 25 號(hào)開始刷題,到 2020 年 3 月 25 號(hào),整整一年的時(shí)間。原計(jì)劃是每天一題。實(shí)際上每天有時(shí)候不止一題,最終完成了 600+:

一個(gè)溫馨提示:筆者本以為每天做一題,會(huì)讓這個(gè) submissions 圖全綠,但是我發(fā)現(xiàn)我錯(cuò)了。如果你也想堅(jiān)持,讓這個(gè)圖全綠,一定要注意以下的問題:LeetCode 服務(wù)器是在 +0 時(shí)區(qū)的,這個(gè)圖也是按照這個(gè)時(shí)區(qū)計(jì)算的。也就是說,中國(guó)每天早上 8 點(diǎn)之前,是算前一天的!也是因?yàn)闀r(shí)區(qū)的問題,導(dǎo)致我空白了這 22 個(gè)格子。比如有一道 Hard 題很難,當(dāng)天工作也很多,晚上下班回家想出來了就到第二天凌晨了。于是再做一題當(dāng)做第二天的量。結(jié)果會(huì)發(fā)現(xiàn)這 2 題都算前一天的。有時(shí)候筆者早上 6 點(diǎn)起床刷題,提交以后也都是前一天的。
(當(dāng)然這些都是過去了,不重要了,全當(dāng)是奮斗路上的一些小插曲)
2020 年筆者肯定還會(huì)繼續(xù)刷題,因?yàn)檫€沒有達(dá)到自己的一些目標(biāo)??赡軙?huì)朝著 1000 題奮進(jìn),也有可能刷到 800 題的時(shí)候回頭開始二刷,三刷。(不達(dá)目的不罷休吧~)
關(guān)于書中的代碼
代碼都放在 github repo 中,按題號(hào)可以搜索到題目。
本書題目的代碼都已經(jīng) beats 100% 了。沒有 beats 100% 題解就沒有放到本書中了。那些題目筆者會(huì)繼續(xù)優(yōu)化到 100% 再放進(jìn)來。
有可能讀者會(huì)問,為何要追求 beats 100%。筆者認(rèn)為優(yōu)化到 beats 100% 才算是把這題做出感覺了。有好幾道 Hard 題,筆者都用暴力解法 AC 了,然后只 beats 了 5%。這題就如同沒做一樣。而且面試中如果給了這樣的答案,面試官也不會(huì)滿意,“還有沒有更優(yōu)解?”。如果通過自己的思考能給出更優(yōu)解,面試官會(huì)更滿意一些。
LeetCode 統(tǒng)計(jì)代碼運(yùn)行時(shí)長(zhǎng)會(huì)有波動(dòng)的,相同的代碼提交 10 次可能就會(huì) beats 100% 了。筆者開始沒有發(fā)現(xiàn)這個(gè)問題,很多題用正確的代碼連續(xù)交了很多次,一年提交 3400+ 次,導(dǎo)致我的正確率也變的奇高。??
當(dāng)然,如果還有其他更優(yōu)美的解法,也能 beats 100% 的,歡迎提交 PR,筆者和大家一起學(xué)習(xí)。
目標(biāo)讀者
想通過 LeetCode 提高算法能力的編程愛好者。
編程語言
本書的算法全部用 Go 語言實(shí)現(xiàn)。
使用說明
- 本電子書的左上角有搜索欄,可以迅速幫你找到你想看的章節(jié)和題號(hào)。
- 本電子書每頁(yè)都接入了 Gitalk,每一頁(yè)的最下方都有評(píng)論框可以評(píng)論,如果沒有顯示出來,請(qǐng)檢查自己的網(wǎng)絡(luò)。
互動(dòng)與勘誤
如果書中文章有所遺漏,歡迎點(diǎn)擊所在頁(yè)面下邊的 edit 按鈕進(jìn)行評(píng)論和互動(dòng),感謝您的支持與幫助。
最后
一起開始刷題吧~

本作品采用 知識(shí)署名-非商業(yè)性使用-禁止演繹 (BY-NC-ND) 4.0 國(guó)際許可協(xié)議 進(jìn)行許可。