代碼隨想錄——跟著Carl學算法
鏈接:https://pan.baidu.com/s/1AEoaCMgtNhUkoGz2Xzjbsw?pwd=uma5?
提取碼:uma5

而我也被這一魔力所吸引。
十年前我開始學習算法,并且開始寫與算法相關的博客。當時寫算法博客的人還不多,網上能搜索到的算法文章也有限。
很多人沒有寫博客的習慣,因為寫博客在一定程度上確實“耽誤時間”。
不過當時我只是想記錄下來,想著以后如果把這些知識都忘了,至少博客可以證明:曾經我掌握過。
沒想到,算法陪伴我一晃就是十年,從本科到研究生,從一家公司到另一家公司,再到算法圖書的出版……我的每一段人生經歷都在從不同的角度和算法打交道。
隨著多年學習和實踐,我在各種在線判題平臺上積累了上千題,對算法的理解已經有了一套獨特的體系。
同時我也發(fā)現,很多讀者在刷題和學習算法時,真正的苦惱在于沒有一套行之有效的刷題順序。
例如,動態(tài)規(guī)劃是公認的程序員面試里最難掌握的算法,也是出現頻率最高的算法。如果僅僅講解幾道題目,即使再舉一反三也遠遠達不到真正理解的程度。如果把動態(tài)規(guī)劃的題目單純地堆砌在一起,也只會讓人越學越懵,陷入“一看就會,一寫就廢”的怪圈。講清楚一兩道題容易,但把整個動態(tài)規(guī)劃的各個分支講清楚,把每道題目講透徹,并用一套方法論來指導就有難度了。這既是我無數日夜伏案思考、反復推理,要幫助讀者解決的問題,也是本書的使命所在。
對于二叉樹、回溯算法、動態(tài)規(guī)劃等重點數據結構與算法,本書都總結了一套行之有效的方法論,系統性地解決這些算法的相關問題,并把相關題目按照由易到難的順序編排,讓讀者循序漸進地征服算法的一座又一座高山。
本書特色
剛開始學習數據結構與算法,或者在力扣(LeetCode)上刷題的讀者都有這種困惑——從何學起,先學什么,再學什么。很多人刷題的效率低,主要體現在以下三點:
— 難以尋找適合自己的題目。
— 找到了不合適現階段做的題目,結果發(fā)現毫無頭緒。
— 沒有全套的優(yōu)質題解可以參考。
我相信很多讀者對此深有體會,所以我將每一個專題中的題目按照由易到難的順序進行編排,每一道題目所涉及的知識都會有相應的題目做知識鋪墊,做到環(huán)環(huán)相扣。
建議讀者按章節(jié)順序閱讀本書,在閱讀的過程中會發(fā)現題目編排上的良苦用心。
本書不僅在題目編排上精心設計,而且在針對讀者最頭痛的算法問題上做了詳細且深入的講解。
關于動態(tài)規(guī)劃,都知道遞推公式的重要性,但dp數組的含義、dp數組的初始化、遍歷順序,以及如何打印dp數組來排查Bug,這些都很重要。例如,解決背包問題時,遍歷順序才是最關鍵的,也是最難理解的。
關于回溯算法,題目要求集合之間不可重復,那么就需要去重。雖然各種資料都說要去重,但沒有說清楚是“樹層去重”還是“樹枝去重”——這是我為了說明去重的過程而創(chuàng)造的兩個詞匯。
關于KMP算法,都知道使用前綴表進行回退,可什么是前綴表,為什么一定要使用前綴表,根據前綴表進行回退有幾種方式,這些卻沒有說清楚,導致大家看得一頭霧水。
關于二叉樹,不同的遍歷順序的遞歸函數究竟如何安排,遞歸函數什么時候需要返回值,什么時候不用返回值,什么情況下分別使用前、中、后序遍歷,如何實現迭代法,這些都決定了對二叉樹的理解是否到位。
本書我同時針對每一個專題的特點,整理出其通用的解法套路。例如,在二叉樹專題中,總結了遞歸“三部曲”來幫助讀者掌握二叉樹中各種遍歷方式的寫法。回溯算法中的回溯“三部曲”可以幫助讀者理解回溯算法晦澀難懂的過程。動態(tài)規(guī)劃中的動規(guī)“五部曲”可以幫助讀者在一套思考框架下解決動態(tài)規(guī)劃題目。
相信讀者耐心看完本書,會對書中介紹的算法有更深層次的理解。
本書配套資源
本書統一使用C++語言進行講解,對于使用其他語言的讀者,支持Java、Python、Go、JavaScript等多語言版本,同時一些題目還有動畫演示,幫助讀者更好地掌握本書內容。
致謝
這里要感謝錄友們,是你們的支持,讓“代碼隨想錄”從無到有,到最后出版成書與讀者見面。雖然從未謀面,但通過文字,我們已經交流了整整一年有余。真心地感謝每一位錄友。
感謝電子工業(yè)出版社的工作人員,特別是陳曉猛編輯。陳編輯工作認真負責,是非??煽康暮献骰锇椤?/p>
最后我要感謝我的父母——孫世忠先生和馬麗麗女士。父母在我求學的路上給予了我最大的支持,付出了非常多。我無以為謝,謹以此書獻給他們。
孫秀洋(@程序員Carl)
2021年10月11日于深圳南山