主頁 >  其他 > ??兩萬字《演算法 + 資料結構》如何開始??

??兩萬字《演算法 + 資料結構》如何開始??

2021-09-13 09:19:34 其他

文章目錄

  • 1??前言:追憶我的刷題經歷
  • 2??演算法和資料結構的重要性
    • 👪1、適用人群
    • 🎾2、有何作用
    • 📜3、演算法簡介
    • 🌲4、資料結構
  • 3??如何開始持續的刷題
    • 📑1、立軍令狀
    • 👩????👩2、培養興趣
    • 🚿3、狂切水題
    • 💪🏻4、養成習慣
    • 🈵5、一周出師
  • 4??簡單資料結構的掌握
    • 🚂1、陣列
    • 🎫2、字串
    • 🎇3、鏈表
    • 🌝4、哈希表
    • 👨?👩?👧5、佇列
    • 👩?👩?👦?👦6、堆疊
    • 🌵7、二叉樹
    • 🌳8、多叉樹
    • 🌲9、森林
    • 🍀10、樹狀陣列
    • 🌍11、圖
  • 5??簡單演算法的入門
    • 🚊10、簡單動態規劃
  • 6??刷題順序的建議
    • 👨?👦1、入門演算法
    • 👩?👧?👦2、初級演算法
    • 👩?👩?👧?👦3、中級演算法
  • 7??系統學習演算法和資料結構
    • 🚍1、進階動態規劃
    • 🪐2、強勁圖論搜索
    • 0??3、進階初等數論
    • 🛑4、進階計算幾何
    • 📏5、字串的匹配
    • 🎄6、高級資料結構

1??前言:追憶我的刷題經歷

??大學的時候比較瘋狂,除了上課的時候,基本都是在機房刷題,當然,有時候連上課都在想題目,紙上寫好代碼,一下課就沖進機房把代碼敲了,目的很單純,為了沖排行榜,就像玩游戲一樣,享受霸榜的快感,
??當年主要是在 杭電OJ (HDOJ)北大OJ(POJ) 這兩個在線平臺上刷題,那時候應該還沒有(LeetCode、洛谷、牛客 這些主流的刷題網站),后來參加作業以后,剩余的時間不多了,也就沒怎么刷了, 但是 演算法思維 也就是靠上大學那四年鍛煉出來的,


??當年題目少,刷題的人也少,所以勉強還沖到過第一,現在去看已經 58 名了,可見 長江后浪推前浪,前浪 S 在沙灘上,時勢造英雄啊!

??北大人才輩出,相對題目也比較難,所以明顯有點 心有余而力不足 的感覺,刷的相對就少很多,而且這個 OJ 也沒什么人維護了,看我的簽名,當時竟然還想著給博客引點流,現在估計都沒什么人去那個網站了吧,如果有,記得評論區告訴我,一起緬懷一下逝去的青春,

🙉飯不食,水不飲,題必須刷🙉

C語言免費動漫教程,和我一起打卡!
🌞《光天化日學C語言》🌞

LeetCode 太難?先看簡單題!
🧡《C語言入門100例》🧡

資料結構難?不存在的!
🌳《畫解資料結構》🌳

LeetCode 太簡單?演算法學起來!
🌌《夜深人靜寫演算法》🌌

在這里插入圖片描述

2??演算法和資料結構的重要性

👪1、適用人群

  • 這篇文章會從 「演算法和資料結構」 零基礎開始講,所以,如果你是演算法大神,可以盡情在評論區嘲諷我哈哈,目的當然是幫助想要涉足演算法領域,或者正在找作業的朋友,以及將要找作業的大學生,更加有效快速的掌握演算法思維,能夠在職場面試和筆試中一展身手,
  • 這篇文章中,我會著重講解一些常見的 「演算法和資料結構」 的設計思想,并且配上動圖,主要針對面試中常見的問題和新手朋友們比較難理解的點進行決議,當然,后面也會給出面向演算法競賽的提綱,如果有興趣深入學習的歡迎在評論區留言,一起成長交流,
  • 零基礎學演算法的最好方法,莫過于刷題了,任何事情都是需要堅持的,刷題也一樣,沒有刷夠足夠的題,就很難做出系統性的總結,所以上大學的時候,我花了三年的時間來刷題, 作業以后還是會抽點時間出來刷題,

千萬不要用作業忙來找借口,時間擠一擠總是有的,

  • 我現在上班地鐵上一個小時,下班地鐵又是一個小時,比如這篇文章的起草,就是在 地鐵 上完成的,如何利用這兩個小時的時間,做一些有建設性的事情,才是最重要的,刷抖音一個小時過得很快,刷題也是同樣的道理,
  • 當然,每天不需要花太多時間在這個上面,把這個事情做成一個規劃,按照長期去推進,反正也沒有 KPI 壓力,就當成是作業之余的一種消遣,還能夠提升思維能力,

所以,無論你是 小學生中學生高中OIer大學ACMer職場人士,只要想開始,一切都不會太晚!

🎾2、有何作用

  • 我們平常使用的 智能手機、搜索引擎、網站、作業系統、游戲、軟體、人工智能,都大量地應用了 「演算法與資料結構」 的知識,以及平時你用到的各種庫的底層實作,也是通過各種演算法和資料結構組合出來的,所以可以說,有程式的地方,就有江湖 演算法,有演算法就一定會有對應的資料結構,
  • 如果你只是想學會寫代碼,或許 「演算法與資料結構」 并不是那么重要,但是想要往更深一步發展,「演算法與資料結構」 是必不可少的,

??現在一些主流的大廠,在面試快結束的時候都會 奉上一道演算法題,如果你敲不出來,可能你的 offer 年包就打了 七折,或者直接與 offer 失之交臂,都是有可能的(因為我自己也是萬惡的面試官,看到候選人的演算法題寫不出來我也是操碎了心,但是我一般會給足容錯,比如給三個演算法題,挑一個寫,任意寫出一個都行),

  • 當然,它不能完全代表你的編碼能力,因為有些演算法確實是很巧妙,加上緊張的面試氛圍,想不出來其實也是正常的,但是你能確保面試官是這么想的嗎?我們要做的是十足的準備,既然決定出來,offer 當然是越高越好,畢竟大家都要養家糊口,房價又這么貴,如果能夠在演算法這一塊取得先機,也不失為一個捷徑,

所以,你問我演算法和資料結構有什么用?我可以很明確的說,和你的年薪息息相關,

  • 當然,面試中 「演算法與資料結構」 知識的考察只是面試內容的一部分,其它還有很多面試要考察的內容,當然不是本文主要核心內容,這里就不做展開了,

📜3、演算法簡介

  • 演算法是什么東西?
  • 它是一種方法,一種解決問題的方案,
  • 舉個例子,你現在要去上班,可以選擇 走路、跑步、坐公交、坐地鐵、自己開車 等等,這些都是解決方案,但是它們都會有一些衡量指標,讓你有一個權衡,最后選擇你認為最優的策略去做,
  • 而衡量的指標諸如:時間消耗、金錢消耗、是否需要轉車、是否可達 等等,

時間消耗就對應了:時間復雜度
金錢消耗就對應了:空間復雜度
是否可達就對應了:演算法可行性

  • 當然,是否需要轉車,從某種程度上都會影響 時間復雜度 或者 空間復雜度

🌲4、資料結構

  • 對于實作某個演算法,我們往往會用到一些資料結構,
  • 因為我們通常不能一下子把資料處理完,更多的時候需要先把它們放在一個容器或者說快取里面,等到一定的時刻再把它們拿出來,
  • 這其實是一種 「空間換時間」 思想的體現, 恰當使用資料結構可以幫助我們高效地處理資料,
  • 常用的一些資料結構如下:
資料結構應用場景
陣列線性存盤、元素為任意相同型別、隨機訪問
字串線性存盤、元素為字符、結尾字符、隨機訪問
鏈表鏈式存盤、快速洗掉
堆疊先進后出
佇列先進先出
哈希表隨機存盤、快速增刪改查
二叉樹對數時間增刪改查,二叉查找樹、線段樹
多叉樹B/B+樹 硬碟樹、字典樹 字串前綴匹配
森林并查集 快速合并資料
樹狀陣列單點更新,成段求和
  • 為什么需要引入這么多資料結構呢?

??答案是:任何一種資料結構是不是 完美的,所以我們需要根據對應的場景,來采用對應的資料結構,具體用哪種資料結構,需要通過刷題不斷重繪經驗,才能總結出來,

3??如何開始持續的刷題

  • 有朋友告訴我,題目太難了,根本不會做,每次都是看別人的解題報告,

📑1、立軍令狀

  • 所謂 「軍令狀」,其實就是給自己定一個目標,給自己樹立一個目標是非常重要的,有 「目標才會有方向,有目標才會有動力,有目標才會有人生的意義」 ,而軍令狀是貶義的,如果不達成就會有各種懲罰,所以其實你是心不甘情不愿的,于是這件事情其實是無法持久下去的,

事實證明,立軍令狀是不可取的,

  • 啊這……所以我們還是要采用一些能夠持久下去的方法,

👩????👩2、培養興趣

  • 為了讓這件事情能夠持久下去,一定要培養出興趣,適時的給自己一些正反饋,正反饋的作用就是每過一個周期,如果效果好,就要有獎勵,這個獎勵機制可以自己設定,但是 「不能作弊」 ,一旦作弊就像單機游戲修改數值,流失是遲早的事,
  • 舉個例子,我們可以給每天制定一些 「不一樣的目標和獎勵」 ,比如下圖所示:
刷題的第?天目標題數是否完成完成獎勵
11攻擊力 + 10
21防御力 + 10
32出去吃頓好的
42攻擊力 + 29
53防御力 + 60
61攻擊力 + 20
74出去吃頓好的
81防御力 + 50
  • 當然,這個完成獎勵你可以自己定,總而言之,要是對你有傭訓的獎勵才是有意義的,

🚿3、狂切水題

  • 剛開始刷的 300 題一定都是 「水題」 ,刷 「水題」 的目的是讓你養成一個每天刷題的習慣,久而久之,不刷題的日子會變得無比煎熬,當然,刷著刷著,你會發現,水題會越來越多,因為刷題的程序中,你已經無形中不斷成長起來了,
  • 至少這個方法我用過,非常靈驗!推薦刷題從水題開始,

如果不知道哪里有水題,推薦:
?? C語言入門水題:《C語言入門100例》
??C語言演算法水題:《LeetCode演算法全集》

💪🏻4、養成習慣

  • 相信如果切了 300 個 「水題」 以后,刷題自然而然就成了習慣,想放棄都難,這個專業上講,其實叫 沉沒成本,有興趣的可以自行百度,這里就不再累述了,

🈵5、一周出師

  • 基本上如果能夠按照這樣的計劃去執行,一周以后,一定會有識訓,沒有識訓的話,可以來找我,

4??簡單資料結構的掌握

🚂1、陣列

記憶體結構:記憶體空間連續
實作難度:簡單
下標訪問:支持
分類:靜態陣列、動態陣列
插入時間復雜度 O ( n ) O(n) O(n)
查找時間復雜度 O ( n ) O(n) O(n)
洗掉時間復雜度 O ( n ) O(n) O(n)

🎫2、字串

記憶體結構:記憶體空間連續,類似字符陣列
實作難度:簡單,一般系統會提供一些方便的字串操作函式
下標訪問:支持
插入時間復雜度 O ( n ) O(n) O(n)
查找時間復雜度 O ( n ) O(n) O(n)
洗掉時間復雜度 O ( n ) O(n) O(n)

🎇3、鏈表

記憶體結構:記憶體空間連續不連續,看具體實作
實作難度:一般
下標訪問:不支持
分類:單向鏈表、雙向鏈表、回圈鏈表、DancingLinks
插入時間復雜度 O ( 1 ) O(1) O(1)
查找時間復雜度 O ( n ) O(n) O(n)
洗掉時間復雜度 O ( 1 ) O(1) O(1)

🌝4、哈希表

記憶體結構:哈希表本身連續,但是衍生出來的結點邏輯上不連續
實作難度:一般
下標訪問:不支持
分類:正數哈希、字串哈希、滾動哈希
插入時間復雜度 O ( 1 ) O(1) O(1)
查找時間復雜度 O ( 1 ) O(1) O(1)
洗掉時間復雜度 O ( 1 ) O(1) O(1)

  • 哈希表相關的內容,可以參考我的這篇文章:
  • 夜深人靜寫演算法(九)- 哈希表

👨?👩?👧5、佇列

記憶體結構:看用陣列實作,還是鏈表實作
實作難度:一般
下標訪問:不支持
分類:FIFO、單調佇列、雙端佇列
插入時間復雜度 O ( 1 ) O(1) O(1)
查找時間復雜度:理論上不支持
洗掉時間復雜度 O ( 1 ) O(1) O(1)

  • 佇列相關的內容,可以參考我的這篇文章:
  • 夜深人靜寫演算法(十)- 單向廣搜

👩?👩?👦?👦6、堆疊

記憶體結構:看用陣列實作,還是鏈表實作
實作難度:一般
下標訪問:不支持
分類:FILO、單調堆疊
插入時間復雜度 O ( 1 ) O(1) O(1)
查找時間復雜度:理論上不支持
洗掉時間復雜度 O ( 1 ) O(1) O(1)

  • 堆疊相關的內容,可以參考我的這篇文章:
  • 夜深人靜寫演算法(十一)- 單調堆疊

🌵7、二叉樹

優先佇列 是 堆實作的,所以也屬于 二叉樹 范疇,它和佇列不同,不屬于線性表,
記憶體結構:記憶體結構一般不連續,但是有時候實作的時候,為了方便,一般是物理連續,邏輯不連續
實作難度:較難
下標訪問:不支持
分類:二叉樹 和 多叉樹
插入時間復雜度:看情況而定
查找時間復雜度:理論上 O ( l o g 2 n ) O(log_2n) O(log2?n)
洗掉時間復雜度:看情況而定

🌳8、多叉樹

記憶體結構:記憶體結構一般不連續,但是有時候實作的時候,為了方便,一般是物理連續,邏輯不連續
實作難度:較難
下標訪問:不支持
分類:二叉樹 和 多叉樹
插入時間復雜度:看情況而定
查找時間復雜度:理論上 O ( l o g 2 n ) O(log_2n) O(log2?n)
洗掉時間復雜度:看情況而定

  • 一種經典的多叉樹是字典樹,可以參考我的這篇文章:
  • 夜深人靜寫演算法(七)- 字典樹

🌲9、森林

  • 比較經典的森林是:并查集,可以參考我的這篇文章:
  • 夜深人靜寫演算法(五)- 并查集

🍀10、樹狀陣列

  • 樹狀陣列是用來做 單點更新,成端求和 的問題的,有關于它的內容,可以參考:
  • 夜深人靜寫演算法(十三)- 樹狀陣列

🌍11、圖

記憶體結構:不一定
實作難度:難
下標訪問:不支持
分類:有向圖、無向圖
插入時間復雜度:根據演算法而定
查找時間復雜度:根據演算法而定
洗掉時間復雜度:根據演算法而定

1、圖的概念

  • 在講解最短路問題之前,首先需要介紹一下計算機中圖(圖論)的概念,如下:
  • G G G 是一個有序二元組 ( V , E ) (V,E) (V,E),其中 V V V 稱為頂點集合, E E E 稱為邊集合, E E E V V V 不相交,頂點集合的元素被稱為頂點,邊集合的元素被稱為邊,
  • 對于無權圖,邊由二元組 ( u , v ) (u,v) (u,v) 表示,其中 u , v ∈ V u, v \in V u,vV,對于帶權圖,邊由三元組 ( u , v , w ) (u,v, w) (u,v,w) 表示,其中 u , v ∈ V u, v \in V u,vV w w w 為權值,可以是任意型別,
  • 圖分為有向圖和無向圖,對于有向圖, ( u , v ) (u, v) (u,v) 表示的是 從頂點 u u u 到 頂點 v v v 的邊,即 u → v u \to v uv;對于無向圖, ( u , v ) (u, v) (u,v) 可以理解成兩條邊,一條是 從頂點 u u u 到 頂點 v v v 的邊,即 u → v u \to v uv,另一條是從頂點 v v v 到 頂點 u u u 的邊,即 v → u v \to u vu

2、圖的存盤

  • 對于圖的存盤,程式實作上也有多種方案,根據不同情況采用不同的方案,接下來以圖二-3-1所表示的圖為例,講解四種存盤圖的方案,

1)鄰接矩陣

  • 鄰接矩陣是直接利用一個二維陣列對邊的關系進行存盤,矩陣的第 i i i 行第 j j j 列的值 表示 i → j i \to j ij 這條邊的權值;特殊的,如果不存在這條邊,用一個特殊標記 ∞ \infty 來表示;如果 i = j i = j i=j,則權值為 0 0 0
  • 它的優點是:實作非常簡單,而且很容易理解;缺點也很明顯,如果這個圖是一個非常稀疏的圖,圖中邊很少,但是點很多,就會造成非常大的記憶體浪費,點數過大的時候根本就無法存盤,
  • [ 0 ∞ 3 ∞ 1 0 2 ∞ ∞ ∞ 0 3 9 8 ∞ 0 ] \left[ \begin{matrix} 0 & \infty & 3 & \infty \\ 1 & 0 & 2 & \infty \\ \infty & \infty & 0 & 3 \\ 9 & 8 & \infty & 0 \end{matrix} \right] ?????019?08?320?30??????

2)鄰接表

  • 鄰接表是圖中常用的存盤結構之一,采用鏈表來存盤,每個頂點都有一個鏈表,鏈表的資料表示和當前頂點直接相鄰的頂點的資料 ( v , w ) (v, w) (v,w),即 頂點 和 邊權,
  • 它的優點是:對于稀疏圖不會有資料浪費;缺點就是實作相對鄰接矩陣來說較麻煩,需要自己實作鏈表,動態分配記憶體,
  • 如圖所示, d a t a data data ( v , w ) (v, w) (v,w) 二元組,代表和對應頂點 u u u 直接相連的頂點資料, w w w 代表 u → v u \to v uv 的邊權, n e x t next next 是一個指標,指向下一個 ( v , w ) (v, w) (v,w) 二元組,
  • 在 C++ 中,還可以使用 vector 這個容器來代替鏈表的功能;
    vector<Edge> edges[maxn];

3)前向星

  • 前向星是以存盤邊的方式來存盤圖,先將邊讀入并存盤在連續的陣列中,然后按照邊的起點進行排序,這樣陣列中起點相等的邊就能夠在陣列中進行連續訪問了,
  • 它的優點是實作簡單,容易理解;缺點是需要在所有邊都讀入完畢的情況下對所有邊進行一次排序,帶來了時間開銷,實用性也較差,只適合離線演算法,
  • 如圖所示,表示的是三元組 ( u , v , w ) (u, v, w) (u,v,w) 的陣列, i d x idx idx 代表陣列下標,
    在這里插入圖片描述
  • 那么用哪種資料結構才能滿足所有圖的需求呢?
  • 接下來介紹一種新的資料結構 —— 鏈式前向星,

4)鏈式前向星

  • 鏈式前向星和鄰接表類似,也是鏈式結構和陣列結構的結合,每個結點 i i i 都有一個鏈表,鏈表的所有資料是從 i i i 出發的所有邊的集合(對比鄰接表存的是頂點集合),邊的表示為一個四元組 ( u , v , w , n e x t ) (u, v, w, next) (u,v,w,next),其中 ( u , v ) (u, v) (u,v) 代表該條邊的有向頂點對 u → v u \to v uv w w w 代表邊上的權值, n e x t next next 指向下一條邊,
  • 具體的,我們需要一個邊的結構體陣列 edge[maxm]maxm表示邊的總數,所有邊都存盤在這個結構體陣列中,并且用head[i]來指向 i i i 結點的第一條邊,
  • 邊的結構體宣告如下:
struct Edge {
    int u, v, w, next;
    Edge() {}
    Edge(int _u, int _v, int _w, int _next) :
        u(_u), v(_v), w(_w), next(_next) 
    {
    }
}edge[maxm];
  • 初始化所有的head[i] = -1,當前邊總數 edgeCount = 0
  • 每讀入一條 u → v u \to v uv 的邊,呼叫 addEdge(u, v, w),具體函式的實作如下:
void addEdge(int u, int v, int w) {
    edge[edgeCount] = Edge(u, v, w, head[u]);
    head[u] = edgeCount++;
}
  • 這個函式的含義是每加入一條邊 ( u , v , w ) (u, v, w) (u,v,w),就在原有的鏈表結構的首部插入這條邊,使得每次插入的時間復雜度為 O ( 1 ) O(1) O(1),所以鏈表的邊的順序和讀入順序正好是逆序的,這種結構在無論是稠密的還是稀疏的圖上都有非常好的表現,空間上沒有浪費,時間上也是最小開銷,
  • 呼叫的時候只要通過head[i]就能訪問到由 i i i 出發的第一條邊的編號,通過編號到edge陣列進行索引可以得到邊的具體資訊,然后根據這條邊的next域可以得到第二條邊的編號,以此類推,直到 next域為 -1 為止,
for (int e = head[u]; ~e; e = edges[e].next) {
    int v = edges[e].v;
    ValueType w = edges[e].w;
    ...
}
  • 文中的 ~e等價于 e != -1,是對e進行二進制取反的操作(-1 的的補碼二進制全是 1,取反后變成全 0,這樣就使得條件不滿足跳出回圈),

5??簡單演算法的入門

  • 入門十大演算法是 線性列舉、線性迭代、簡單排序、二分列舉、雙指標、差分法、位運算、貪心、分治遞回、簡單動態規劃,
  • 對于這十大演算法,我會逐步更新道這個專欄里面:《LeetCode演算法全集》,
  • 濃縮版可參考如下文章:《十大入門演算法》

🚊10、簡單動態規劃

LeetCode 746. 使用最小花費爬樓梯

??陣列的每個下標作為一個階梯,第 i i i 個階梯對應著一個非負數的體力花費值 c o s t [ i ] cost[i] cost[i](下標從 0 開始),每當爬上一個階梯,都要花費對應的體力值,一旦支付了相應的體力值,就可以選擇 向上爬一個階梯 或者 爬兩個階梯,求找出達到樓層頂部的最低花費,在開始時,可以選擇從下標為 0 或 1 的元素作為初始階梯,
??樣例輸入: c o s t = [ 1 , 99 , 1 , 1 , 1 , 99 , 1 , 1 , 99 , 1 ] cost = [1, 99, 1, 1, 1, 99, 1, 1, 99, 1] cost=[1,99,1,1,1,99,1,1,99,1]
??樣例輸出: 6 6 6
如圖所以,藍色的代表消耗為 1 的樓梯,紅色的代表消耗 99 的樓梯,

a、思路分析

  • 令走到第 i i i 層的最小消耗為 f [ i ] f[i] f[i]
  • 假設當前的位置在 i i i 層樓梯,那么只可能從 i ? 1 i-1 i?1 層過來,或者 i ? 2 i-2 i?2 層過來;
  • 如果從 i ? 1 i-1 i?1 層過來,則需要消耗體力值: f [ i ? 1 ] + c o s t [ i ? 1 ] f[i-1] + cost[i-1] f[i?1]+cost[i?1]
  • 如果從 i ? 2 i-2 i?2 層過來,則需要消耗體力值: f [ i ? 2 ] + c o s t [ i ? 2 ] f[i-2] + cost[i-2] f[i?2]+cost[i?2]
  • 起點可以在第 0 或者 第 1 層,于是有狀態轉移方程:
  • f [ i ] = { 0 i = 0 , 1 min ? ( f [ i ? 1 ] + c o s t [ i ? 1 ] , f [ i ? 2 ] + c o s t [ i ? 2 ] ) i > 1 f[i] = \begin{cases} 0 & i=0,1\\ \min ( f[i-1] + cost[i-1], f[i-2] + cost[i-2] ) & i > 1\end{cases} f[i]={0min(f[i?1]+cost[i?1],f[i?2]+cost[i?2])?i=0,1i>1?

b. 時間復雜度

  • 狀態數: O ( n ) O(n) O(n)
  • 狀態轉移: O ( 1 ) O(1) O(1)
  • 時間復雜度: O ( n ) O(n) O(n)

c. 代碼詳解

class Solution {
    int f[1100];                                                   // (1)
public:
    int minCostClimbingStairs(vector<int>& cost) {
        f[0] = 0, f[1] = 0;                                        // (2)
        for(int i = 2; i <= cost.size(); ++i) {
            f[i] = min(f[i-1] + cost[i-1], f[i-2] + cost[i-2]);    // (3)
        }
        return f[cost.size()];
    }
};
  • ( 1 ) (1) (1)f[i]代表到達第 i i i 層的消耗的最小體力值,
  • ( 2 ) (2) (2) 初始化;
  • ( 3 ) (3) (3) 狀態轉移;

有沒有發現,這個問題和斐波那契數列很像,只不過斐波那契數列是求和,這里是求最小值,


6??刷題順序的建議

??然后介紹一下刷題順序的問題,我們刷題的時候千萬不要想著一步到位,一開始,沒有刷滿三百題,姿態放低,都把自己當成小白來處理,
??這里以刷 LeetCode 為例,我目前只刷了不到 50 題,所以我是小白,
??當我是小白時,我只刷入門題,也就是下面這幾個專題,先把上面所有的題目刷完,在考慮下一步要做什么,

👨?👦1、入門演算法

種類鏈接
演算法演算法入門
資料結構資料結構入門
陣列字串專題陣列和字串
動態規劃專題動態規劃入門、DP路徑問題

??當入門的題刷完了,并且都能講述出來自己刷題的程序以后,我們再來看初級的一些演算法和簡單的資料結構,簡單的資料結構就是線性表了,包含:陣列、字串、鏈表、堆疊、佇列 等等,即下面這些專題,

👩?👧?👦2、初級演算法

種類鏈接
演算法初級演算法
堆疊和佇列專題佇列 & 堆疊

??上面的題刷完以后,其實已經算是基本入門了,然后就可以開始系統性的學習了,
??當然,基本如果真的到了這一步,說明你的確已經愛上了刷題了,那么我們可以嘗試挑戰一下 LeetCode 上的一些熱門題,畢竟熱門題才是現在面試的主流,能夠有更好的結果,這樣刷題的時候也會有更加強勁的動力不是嗎!

👩?👩?👧?👦3、中級演算法

種類鏈接
演算法中極演算法
二叉樹專題二叉樹
熱門題熱門題 TOP 100

7??系統學習演算法和資料結構

🚍1、進階動態規劃

文章鏈接難度等級推薦閱讀
夜深人靜寫演算法(二)- 動態規劃入門★☆☆☆☆★★★★★
夜深人靜寫演算法(二十六)- 記憶化搜索★☆☆☆☆★★★★★
夜深人靜寫演算法(十九)- 背包總覽★☆☆☆☆★★★★★
夜深人靜寫演算法(二十)- 最長單調子序列★☆☆☆☆★★★★★
夜深人靜寫演算法(二十一)- 最長公共子序列★☆☆☆☆★★★★★
夜深人靜寫演算法(二十二)- 最小編輯距離★★☆☆☆★★★★☆
夜深人靜寫演算法(十四)- 0/1 背包★☆☆☆☆★★★★☆
夜深人靜寫演算法(十五)- 完全背包★★☆☆☆★★★★☆
夜深人靜寫演算法(十六)- 多重背包★★☆☆☆★★★★☆
夜深人靜寫演算法(二十七)- 區間DP★★★☆☆★★★★☆
夜深人靜寫演算法(二十九)- 數位DP★★★☆☆★★★★★
夜深人靜寫演算法(十七)- 分組背包★★★☆☆★★★☆☆
夜深人靜寫演算法(十八)- 依賴背包★★★★☆★★☆☆☆
夜深人靜寫演算法(六)- RMQ★★★☆☆★★☆☆☆
樹形DP待更新
組合博弈待更新
組合計數DP待更新
四邊形不等式待更新
狀態壓縮DP/TSP待更新
斜率優化的動態規劃待更新
插頭DP待更新

🪐2、強勁圖論搜索


1、深度優先搜索

文章鏈接難度等級推薦閱讀
夜深人靜寫演算法(一)- 搜索入門★☆☆☆☆★★★☆☆
夜深人靜寫演算法(八)- 二分圖最大匹配★★☆☆☆★★☆☆☆
最大團待更新
最小生成樹待更新
樹的分治待更新
迭代加深 IDA*待更新
有向圖強連通分量和2-sat待更新
無向圖割邊割點待更新
帶權圖的二分圖匹配待更新
哈密爾頓回路待更新
最近公共祖先待更新
歐拉回路圈套圈待更新
最小費用最大流待更新
最小樹形圖待更新

2、廣度優先搜索

文章鏈接難度等級推薦閱讀
夜深人靜寫演算法(十)- 單向廣搜★★☆☆☆★★★★☆
夜深人靜寫演算法(二十三)- 最短路★★★☆☆★★★★☆
夜深人靜寫演算法(二十五)- 穩定婚姻★★☆☆☆★★☆☆☆
夜深人靜寫演算法(二十四)- 最短路徑樹★★★☆☆★☆☆☆☆
K 短路待更新
差分約束待更新
拓撲排序待更新
A*待更新
雙向廣搜待更新
最大流 最小割待更新

0??3、進階初等數論

文章鏈接難度等級推薦閱讀
夜深人靜寫演算法(三)- 初等數論入門★★☆☆☆★★★★☆
夜深人靜寫演算法(三十)- 二分快速冪★☆☆☆☆★★★★★
夜深人靜寫演算法(三十一)- 歐拉函式★★★☆☆★★★★★
夜深人靜寫演算法(三十二)- 費馬小定理★★☆☆☆★★★☆☆
夜深人靜寫演算法(三十三)- 擴展歐拉定理★★★☆☆★★★★☆
夜深人靜寫演算法(三十四)- 逆元★★★☆☆★★★★☆
夜深人靜寫演算法(三十五)- RSA 加密解密★★★☆☆★★★★★
夜深人靜寫演算法(三十六)- 中國剩余定理★★☆☆☆★★★☆☆
夜深人靜寫演算法(三十七)- 威爾遜定理★★☆☆☆★★★☆☆
夜深人靜寫演算法(三十八)- 整數分塊★★☆☆☆★★★★☆
盧卡斯定理待更新
狄利克雷卷積待更新
莫比烏斯反演待更新
容斥原理待更新
拉賓米勒待更新
Pollard rho待更新
莫隊待更新
原根待更新
大步小步演算法待更新
二次剩余待更新
矩陣二分快速冪待更新
Polya環形計數待更新

🛑4、進階計算幾何

📏5、字串的匹配

🎄6、高級資料結構


🙉飯不食,水不飲,題必須刷🙉

C語言免費動漫教程,和我一起打卡!
🌞《光天化日學C語言》🌞

LeetCode 太難?先看簡單題!
🧡《C語言入門100例》🧡

資料結構難?不存在的!
🌳《畫解資料結構》🌳

LeetCode 太簡單?演算法學起來!
🌌《夜深人靜寫演算法》🌌

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299675.html

標籤:其他

上一篇:LeetCode重建二叉樹詳解

下一篇:《資料結構》第二章 | 線性表 知識梳理(應對期末考)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more