前言
??"為什么演算法這么難?而別人不覺得難”
??“為什么別人能想出來?而我卻想不出來”
??“為什么即便我想得出來?也寫不出來”
??我也曾迷茫,我也曾失落,但是每當通過自己的意念,理解了一個新的演算法以后,之前熬過的苦,瞬間煙消云散,帶給我的只有無盡的快樂,
??為什么金字塔尖的人,寥寥無幾,鳳毛麟角,就是因為他們能,忍常人所不能忍,吃常人所不能吃的苦,才得以成就大業!天下無易成之業,亦無不可成之業,各守乃業則業無不成,
<iframe id="5OPDwdlY-1639950019877" src="https://player.bilibili.com/player.html?aid=764932417" allowfullscreen="true" data-mediaembed="bilibili"></iframe>LeetCode演算法學習路線
完整版視頻地址
??首先讓我們看下,我們接下來這段時間,我們需要學習的內容,主要有:

| 專欄 | 定位 | 適宜人群 |
|---|---|---|
| 「 光天化日學C語言 」 | 「 入門 」 | 沒有任何語言基礎 |
| 「 LeetCode零基礎指南 」 | 「 初級 」 | 零基礎快速上手力扣 |
| 「 C語言入門100例 」 | 「 中級 」 | 零基礎持續C語言練習教程 |
| 「 演算法零基礎100講 」 | 「 高級 」 | 零基礎持續演算法練習教程 |
| 「 畫解資料結構 」 | 「 高級 」 | 「 推薦 」 資料結構動圖教程 |
| 「 演算法進階50講 」 | 「 資深 」 | 進階持續演算法練習教程 |
| 「 LeetCode演算法題集匯總 」 | 「 資深 」 | 全面的力扣演算法題練習集錦 |
| 「 夜深人靜寫演算法 」 | 「 資級 」 | 競賽高端演算法集錦 |
文章目錄
- 前言
- 一、語言基礎
- 1、Hello World
- 2、直接實戰
- 3、及時復盤
- 4、堅持下去
- 5、養成習慣
- 6、九日集訓
- 二、數學基礎
- 1、位運算
- 2、線性代數
- 3、計算幾何
- 4、數論
- 5、組合數學 和 概率論
- 三、資料結構
- 1、線性表
- 1)陣列
- 2)字串
- 3)鏈表
- 4)堆疊
- 5)佇列
- 2、哈希表
- 3、樹
- 1)二叉樹和二叉搜索樹
- 2)堆
- 3)線段樹
- 4)AVL 樹 和 紅黑樹
- 5)字典樹
- 6)霍夫曼樹
- 7)并查集
- 4、圖
- 5、樹狀陣列
- 五、常用演算法
- 1、列舉
- 1)一維列舉
- 2)多維列舉
- 3)前綴和
- 4)雙指標
- 5)二分查找
- 2、排序
- 3、貪心
- 4、搜索
- 5、動態規劃
- 六、雜項演算法
- 七、演算法專欄推薦
- 八、配套福利贈送
一、語言基礎
1、Hello World
??想上手一門語言,第一步一定是 Hello World,先不要急著配環境,如若環境配了幾個時辰,可能起初的雄心壯志,就被配環境的程序消磨殆盡,更加不要談日后的豐功偉業了,
??要成大事就必爭朝夕,讓我們直接進入實戰,
2、直接實戰
??我們直接在力扣上,進行第一段代碼的撰寫,通過這道題,來了解編碼的流程,就算你是演算法零基礎
想必也能看懂,(題目鏈接)
??題目要求我們不要用加號,實作兩個數的加法操作,你讓我不要用,那我就偏要用,我就是要逆天而行,看!就是這么簡單!讓我們來復盤一下,
3、及時復盤
??題目要求回傳兩個整數的和,并且要求不能用 加號,那如果我用了會怎么樣,答案是并不會怎么樣,因為平臺不會對代碼做語法分析,只是呼叫了你的函式,提供一些輸入資料,如果輸出資料和它給定的相同,就算通過,
??換言之,作為你接觸演算法的第一道題,其實這些條件,都無所謂,能過就行,對于新人來說,把問題過掉比問題本身更重要,題數的增加是信心的增加,信心比什么都重要,有了信心你才能繼續往下走,只要你能往下推進,你就能繼續學習,繼續學習你遲早會學到相應的演算法,
??好了,過了這題以后,把這道題放入你的重刷串列,等你對演算法有一定理解以后,再來用題目要求的方法來過掉它,
4、堅持下去
??僅僅做了這一道題是遠遠不夠的,如果不能堅持學習,那么一切美好的愿景都只是海市蜃樓遙不可及,
??現如今,經濟飛速發展,我們要知道 “不進則退,慢進也是退” 的道理,只有當你采取快速高效的行動之后,才能夠在殘酷的競爭中,擁有自己的一席之地!
??有志者事竟成,破釜沉舟,百二秦關終屬楚!
??苦心人天不負,臥薪嘗膽,三千越甲可吞吳!
??始終相信 長風破浪會有時,直掛云帆濟滄海!
5、養成習慣
??單純學習語言未免太過枯燥乏味,所以建議一邊學習一遍刷題,養成每天刷題的習慣,在刷題的程序中鞏固語法,每過一個題相當于是一次正反饋,能夠讓你在刷題旅途中酣暢淋漓,從而更好的保證你一直堅持下去,在沒有任何演算法基礎的情況下,可以按照我提供的專欄來刷題,這也是上上個視頻提到的 九日集訓 的完整教材,主要有以下幾個內容:

??這個專欄主要講解了一些 LeetCode 刷題時的一些難點和要點,主要分為以下幾個章節,并且會持續補充一些方法論的文章,文章有試讀,可以簡單先看一看試讀文章,
6、九日集訓
??「 九日集訓 」是博主推出的一個能夠白嫖付費專欄「 LeetCode零基礎指南 」的活動,通過 「 專欄中的聯系方式 」 或者 「 本文末尾的聯系方式 」 聯系博主,進行報名即可參加,九日一個回圈,第二期計劃 「 2021.12.02 」 開啟,
??玩法很簡單,每天會開啟一篇試讀文章,要求有三點:
??1)閱讀完文章后,課后習題 「 全部刷完 」(都能在文中找到解法,需要自己敲一遍代碼);
??2)寫 「 學習報告 」 并發布社區 九日集訓(每日打卡) 頻道
??3)在 「 打卡帖 」 提交 「 學習報告 」 鏈接;
??完成以上三點后方可晉級到下一天,所有堅持到 9天 的同學,會成為 「 英雄演算法聯盟合伙人 」 群成員,只限500個名額,優勝劣汰,和精英在一起,無論是溝通,學習,都能有更好的發展,你接觸到的人脈也都是不一樣的,等找作業的時候,我也會為大家打通 hr 和獵頭,讓你前程無憂~
??詳細規則參見:九日集訓規則詳解,
??目前第一輪「 九日集訓 」已經進行到第七天,即將開啟第二輪,
二、數學基礎
??LeetCode上的題目相比ACM來說,數學題較少,所以對數學有恐懼的同學也不必擔心,比較常見的數學題主要有:位運算,線性代數,計算幾何,組合數學 ,數論,概率論,

| 板塊 | 題數 |
|---|---|
| 位運算 | 30 |
| 線性代數 | 20 |
| 計算幾何 | 5 |
| 組合數學 | 5 |
| 數論 | 5 |
| 概率論 | 5 |
1、位運算
??位運算主要有:位與、位或、按位取反、異或、左移 和 右移,對應的文章可以看:
??位運算是計算機的精華所在,是必須掌握的內容,大概每個運算操作刷 三 到 五 題就基本有感覺了,
2、線性代數
??線性代數在刷題中,主要內容有 矩陣運算 和 高斯消元,矩陣在程式中的抽象就是二維陣列,如下:
??高斯消元是求解多元一次方程組的,一般在競賽中會遇到,面試一般不問,因為面試官可能也不會,
3、計算幾何
??數論 是 ACM 中一個比較重要的內容,至少一旦出現,一定不會是一個水題,編碼量較大,但是在 LeetCode 中題型較少,可以適當掌握一些基礎內容即可,對應文章如下:
4、數論
??數論 是 ACM 中一個比較重要的內容,但是在 LeetCode 中題型較少,可以適當掌握一些基礎內容即可,對應文章如下:
5、組合數學 和 概率論
??組合數學 和 概率論,在 LeetCode 中題目較少,有興趣可以刷一刷,沒有興趣就不要去刷了,畢竟興趣才是最好的老師,對應的文章如下:
三、資料結構
??任何一種資料結構,都可以認為是一個容器,你可以讓往里面添加元素,也可以從里面移除元素,也可以將某個元素的屬性進行改變,還可以查詢某個元素的屬性,所以,它無非就是 增、刪、改、查,
??每一種資料結構都不是完美的,我們要做的,就是盡量減少 增、刪、改、查 的 時間復雜度 和 空間復雜度,LeetCode 題中涉及到的資料結構主要分為:線性表、哈希表(也叫散串列)、樹、圖、樹狀陣列,
??以下是每個資料結構建議刷的題數(不要被數字嚇到,實際刷下來很多內容是重復的,比如一個問題既可以用陣列做,可以用鏈表做):
| 板塊 | 題數 |
|---|---|
| 陣列 | 100 |
| 字串 | 50 |
| 鏈表 | 50 |
| 堆疊 | 50 |
| 佇列 | 50 |
| 哈希表 | 50 |
| 二叉樹/二叉搜索樹 | 30 |
| 字典樹 | 20 |
| 堆 | 10 |
| 線段樹 | 10 |
| 并查集 | 10 |
| 樹狀陣列 | 10 |
| AVL樹/紅黑樹 | 5 |
| 霍夫曼樹 | 1 |
??接下來,就由我來為大家一一介紹:

1、線性表
??線性表主要有 陣列、字串、鏈表、佇列、堆疊,
1)陣列
??陣列是數學中數列的抽象,在程式中的存盤空間是連續的,陣列和字串相關的題多如牛毛,屬于資料結構中最簡單的內容,和陣列相關的演算法也層次不齊,主要是列舉,即遍歷陣列然后執行相關操作,大部分都較為簡單,建議刷滿 100 題,
2)字串
??字串則是一種特殊的陣列,即字符陣列,字串相關的演算法主要有 字典樹,KMP,前綴自動機,后綴樹組,難度依次遞增,建議先學習 字典樹,很好理解,等力扣題刷滿 500 題以后再來學習剩下幾個演算法也為時不晚,字串的題建議刷滿 50 題,
3)鏈表
??鏈表和陣列是一個對立概念,陣列是順序存盤的,鏈表是鏈式存盤的,也就是鏈表元素的 前驅 和 后繼 在實際存盤空間上,是不一定連續的,鏈表分為 單向鏈表 和 雙向鏈表,理解鏈表以后,就對資料結構有一個更加清晰的認識了,鏈表的題建議刷滿 50 題,
4)堆疊
??堆疊是一種先進后出的資料結構,可以用陣列或者鏈表來實作,主要應用就是將 遞回轉化成迭代,運算式求值就是典型的堆疊的實作,配合深度優先搜索使用,堆疊的題建議刷滿 50題,
5)佇列
??佇列是一種先進先出的資料結構,可以用陣列或者鏈表來實作,主要應用就是 訊息佇列,配合廣度優先搜索使用,在實際編碼程序應用比較廣泛,佇列主要有:先進先出佇列,雙端佇列,回圈佇列,單調佇列,佇列的題建議刷滿 50 題,
2、哈希表
??哈希表也叫散串列,它是一種 插入 和 查詢 都是
O
(
1
)
O(1)
O(1) 的資料結構,唯一的缺點是它是無序的,哈希表的用途非常廣泛,無論是搜索還是動態規劃,都會借用到哈希的思想,
??Python 中的 dict,Lua 中的 table,C++ 中的 unorderd_map,redis 中的 字典,都是由哈希表來實作的,哈希表的題建議刷滿 50 題,
3、樹
??樹 主要有 二叉樹,二叉搜索樹,堆,線段樹,平衡二叉樹,紅黑樹,字典樹,霍夫曼樹,重要性依次遞減,
1)二叉樹和二叉搜索樹
??刷樹相關的題之前,建議先對遞回有一個比較深入的了解,二叉樹的遍歷用到了深度優先搜索,建議重點掌握,二叉樹和二叉搜索樹的題建議刷滿 30 題,
2)堆
??堆也叫優先佇列,是一種完全二叉樹,是一種 增刪
O
(
l
o
g
2
n
)
O(log_2n)
O(log2?n),查詢最值
O
(
1
)
O(1)
O(1) 的資料結構,可以用 C++ 中的 priority_queue,
??建議刷 10 題掌握其用法,
3)線段樹
??線段樹用到了分治思想,典型的問題是區間最值,屬于較難內容,面試考點也較少,建議刷 10 題掌握其思想,
4)AVL 樹 和 紅黑樹
??平衡二叉樹主要有 紅黑樹 和 AVL 樹,STL 中的 map / set 就是一棵平衡二叉樹,和哈希表的功能類似,任何用哈希表的題都可以用它來過掉,面試的時候會問一些 紅黑樹 和 AVL樹 的基礎概念,
5)字典樹
??字典樹主要做字串的前綴匹配,相對較容易理解,大部分用哈希表的題都可以用字典樹求解,建議刷 20 題鞏固概念,
6)霍夫曼樹
??霍夫曼樹主要用于霍夫曼編碼,是一種前綴編碼,題型不多,了解即可,
7)并查集
??并查集是一種利用陣列實作的森林資料結構,建議刷 10 題了解概念即可,
4、圖
??圖主要分為有向圖和無向圖,還有一些特殊的圖比如二分圖,圖主要對應遍歷演算法,即 廣度優先搜索 和 深度優先搜索,后面講常用演算法的時候會提到,
5、樹狀陣列
??樹狀陣列是一種陣列的結構,但是陣列元素之間有樹形鏈接關系,它主要用于:單點更新,成段求和,由于實作簡單,比線段樹的常數時間復雜度低,建議刷 10 題了解一下概念,
五、常用演算法
??基礎的演算法主要分為:列舉、排序、貪心、搜索、動態規劃,

| 板塊 | 題數 |
|---|---|
| 一維列舉 | 30 |
| 雙指標 | 30 |
| 二分列舉 | 30 |
| 前綴和 | 20 |
| 二維列舉 | 10 |
1、列舉
??列舉就是我們通常所說的暴力演算法,主要有:一維列舉、多維列舉、前綴和、雙指標、二分查找,
1)一維列舉
??一維列舉就是一個回圈,題目較多,一般配合 陣列 或者 鏈表 這兩種資料結構進行求解,建議刷 30 題,
2)多維列舉
??多維列舉就是多個回圈嵌套,建議刷題數為 10題,
3)前綴和
??前綴和就是利用預處理將陣列的前綴求和存盤下來,并且在下次計算的時候利用減法在 O ( 1 ) O(1) O(1) 的時間求解,是一個預處理演算法,技巧性較強,建議刷 20 題左右,
4)雙指標
??利用問題的單調性,將原本 O ( n 2 ) O(n^2) O(n2) 的演算法轉換成 O ( n ) O(n) O(n),利用雙指標的題很容易就能看出來,一般是數列,并且 n n n 都在 1 0 6 10^6 106 左右,雙指標是面試的熱門考點,必須掌握,建議刷 30 題鞏固演算法,
5)二分查找
??利用問題的單調性,將原本 O ( n ) O(n) O(n) 的演算法轉換成 O ( l o g 2 n ) O(log_2n) O(log2?n),是一種經典的對數級別的時間復雜度演算法,和雙指標一樣,屬于必須掌握的內容,建議刷 30 題鞏固演算法,
2、排序
??對于排序,已經有太多人講解它了,重要性也不言而喻,建議了解每個排序的演算法實作原理,并且自己動手寫一下,目的是為了提升思維,排序的題建議刷 100 題,
3、貪心
??貪心是一種很神奇的演算法,需要有大量習題總結歸納,一直沒有很好的文章輸出,我盡力寫一篇,很多貪心都是先排序然后再貪心,所以跟著排序專題一起刷,
4、搜索
??搜索主要分為 廣度優先搜索 和 深度優先搜索,廣度優先搜索主要用于求解最短路問題,深度優先搜索主要用于求解窮舉,遍歷類問題,建議各刷 100 題,
| 板塊 | 題數 |
|---|---|
| 深度優先搜索 | 100 |
| 廣度優先搜索 | 100 |
5、動態規劃
??動態規劃又叫DP,入門時建議先刷 一維DP 的題,詳情請見:畫解動態規劃,動態規劃建議 300 題起步,

六、雜項演算法
??雜項演算法比較雜,列出來看看吧,刷不刷也無所謂啦,反正很偏,喜歡就刷去吧!主要有 狀態壓縮,高精度,離散化,模擬,博弈,隨機演算法,采樣演算法,鬧經急轉彎,互動類問題,
七、演算法專欄推薦
| 專欄 | 定位 | 適宜人群 |
|---|---|---|
| 「 光天化日學C語言 」 | 「 入門 」 | 沒有任何語言基礎 |
| 「 LeetCode零基礎指南 」 | 「 初級 」 | 零基礎快速上手力扣 |
| 「 C語言入門100例 」 | 「 中級 」 | 零基礎持續C語言練習教程 |
| 「 演算法零基礎100講 」 | 「 高級 」 | 零基礎持續演算法練習教程 |
| 「 畫解資料結構 」 | 「 高級 」 | 「 推薦 」 資料結構動圖教程 |
| 「 演算法進階50講 」 | 「 資深 」 | 進階持續演算法練習教程 |
| 「 LeetCode演算法題集匯總 」 | 「 資深 」 | 全面的力扣演算法題練習集錦 |
| 「 夜深人靜寫演算法 」 | 「 資級 」 | 競賽高端演算法集錦 |
八、配套福利贈送
語言入門:《光天化日學C語言》(示例代碼)
語言訓練:《C語言入門100例》試用版
資料結構:《畫解資料結構》原始碼
演算法入門:《演算法入門》指引
演算法進階:《夜深人靜寫演算法》演算法模板
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387907.html
標籤:其他
