記錄自己使用Go學演算法的過程 GITHUB地址
Part 1 (TODO)
陣列
- 合併有序陣列(Easy)
- 刪除有序陣列中的重複項(Easy)
- 移動零(Easy)
連結串列
- 反轉連結串列(Easy)
- K 個一組翻轉連結串列(Hard)
- 鄰值查詢(Medium)(ACWing)
- 環形連結串列(Medium)
- 環形連結串列 II (Medium)
棧、佇列
- 有效的括號(Medium)
- 最小棧(Medium)
- 逆波蘭表示式求值(Medium)
- 基本計算器 (Hard)
字首和、差分
- 統計「優美子陣列」(Medium)
- 二維區域和檢索 - 矩陣不可變(Medium)
- 航班預訂統計(Medium)
- 最大子序和(Easy)
雙指標掃描、滑動視窗
- 兩數之和(Easy)
- 兩數之和 II - 輸入有序陣列(Easy)
- 三數之和(Medium)
- 盛最多水的容器(Medium)
單調棧、單調佇列
- 柱狀圖中最大的矩形(Hard)
- 滑動視窗最大值(Hard)
- 接雨水(Hard)
隨機練習
- 加一(Easy)
- 合併兩個有序連結串列(Easy)
- 設計迴圈雙端佇列(Medium)
- 和為 K 的子陣列(Medium)
Part 2
-
- 兩數之和
- 字母異位詞分組
- 串聯所有單詞的子串
-
- LRU 快取機制
-
- 子集
- 組合
- 全排列
-
- 翻轉二叉樹
- 驗證二叉搜尋樹
- 二叉樹的最大深度
- 二叉樹的最小深度
-
- Pow(x, n)
- 括號生成
-
- LRU 快取機制(Medium)
- 子域名訪問計數(Easy)
- 陣列的度(Easy)
- 元素和為目標值的子矩陣數量(Hard)
- 合併K 個升序連結串列(Hard) (要求:用分治實現,不要用堆)
Part 3
-
- 二叉樹的中序遍歷(Easy)
- N 叉樹的前序遍歷(Easy)
- N 叉樹的層序遍歷(Medium)
- 二叉樹的序列化與反序列化(Hard)TODO
- 從前序與中序遍歷序列構造二叉樹(Medium)
-
- 樹的直徑(此題為 LeetCode 會員題)TODO
- 二叉樹的最近公共祖先(Medium)
-
- 冗餘連線(Medium)
- 課程表(Medium)
-
- 電話號碼的字母組合(Medium)
- N 皇后(Hard)
- 島嶼數量(Medium)
- 最小基因變化(Medium)
- 矩陣中的最長遞增路徑(Hard)TODO
-
- 從中序與後序遍歷序列構造二叉樹(Medium)
- 課程表 II (Medium)
- 被圍繞的區域(Medium)
Part 4
-
- golang中container/heap包用法
- 合併 K 個升序連結串列(Hard)
- 滑動視窗最大值(Hard)
-
- 二叉搜尋樹中的插入操作(Medium)
- 後繼者(Medium)
- 刪除二叉搜尋樹中的節點(Medium)
- 把二叉搜尋樹轉換為累加樹(Medium)TODO
-
- 二分查詢(Easy)
- 在排序陣列中查詢元素的第一個和最後一個位置(Medium)
- x 的平方根(Easy)
- 搜尋二維矩陣(Medium)
- 尋找旋轉排序陣列中的最小值(Medium)
-
- 設計推特(Medium)
- 資料流的中位數(Hard)
- 簡單排序
- 大頂堆小頂堆
- 尋找旋轉排序陣列中的最小值 II (Hard)
Part 5
排序
-
- 選擇排序(該放哪個數了)
- 插入排序(這個數該放哪)
- 氣泡排序
非比較類排序
- 計數排序
- 桶排序
- 基數排序
-
-
- 零錢兌換(Medium)TODO
- 檸檬水找零(Easy)
- 分發餅乾(Easy)
- 買賣股票的最佳時機 II (Easy)
- 跳躍遊戲 II (Medium)
- 完成所有任務的最少初始能量(Hard)(貪心證明過程)
Part 6
-
- 零錢兌換(Medium)
- 不同路徑 II (Medium)
- 最長公共子序列(Medium)
- 最長遞增子序列(Medium)
- 最大子序和(Easy)
- 乘積最大子陣列(Medium)TODO
動態規劃二
-
- 買賣股票的最佳時機(Easy)
- 注意題目只允許買入一次,也就是說之前沒有買入也沒有賣出過
- 買賣股票的最佳時機 II(Easy)
- 注意題目沒有限制買入賣出的次數,但是仍要遵守先買入才能賣出
- 買賣股票的最佳時機 III(Easy)
- 注意題目限制完整交易的次數為2,買入前必須賣掉之前的股票
- 買賣股票的最佳時機 IV (Hard)
- 注意題目限制完整交易的次數為k,買入前必須賣掉之前的股票
- 買賣股票的最佳時機含手續費(Medium)
- 注意題目不限制交易次數,套用買賣股票二的模版即可,買入時減去fee
- 最佳買賣股票時機含冷凍期(Medium)
- 注意題目不限制交易次數,買入前必須賣掉之前的股票
- 與股票三、四對比,同樣是三個狀態,但是決策上要根據冷凍期進行調整
- 買賣股票的最佳時機(Easy)
-
- 打家劫舍(Medium)
- 打家劫舍 II - 環形DP (Medium)
- 對比打家劫舍1,第一間屋子可偷可不偷,搜兩遍比較大小
- 編輯距離(Hard)
- dp[i][j] word1 前 i 個字元轉換成 word2 前 j 個字元所使用的的最少步數(已達成時)
-
- 分割等和子集(Medium)
- 零錢兌換 II (Medium)
- 完全揹包模型 + 計數
-
-
- 爬樓梯(Easy)
- 三角形最小路徑和(Medium)
- 最長遞增子序列的個數(Medium)TODO
- 完全平方數(Medium)
- 完全平方數就是物品(可以無限件使用),湊個正整數n就是揹包,問湊滿這個揹包最少有多少物品?
- 跳躍遊戲(Medium)
- 跳躍遊戲 II (Medium)
- 貪心
- DP
f[i] 為到達第 i 個位置所需要的最少步數
當我們要求某一個 f[i] 的時候,我們需要找到最早能夠經過一步到達 i 點的 j 點
即有狀態轉移方程:f[i] = f[j] + 1
Part 7
-
- 滿足不等式的最大值(Hard)
- 二元組不等式的推導優化 + 滑動視窗最大值
- 引入deque實現 github.com/gammazero/deque/blob/ma...
- 環形子陣列的最大和(Medium)TODO
- 滿足不等式的最大值(Hard)
-
- 戳氣球(Hard)
- 合併石頭的最低成本(Hard)
-
- 打家劫舍 III (Medium)
-
- 實現 Trie (字首樹) (Medium)
- Trie 樹的核心思想是空間換時間;
無論儲存樹的結構、字符集陣列還是字符集對映,都需要額外的空間;
利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的;
分組思想–字首相同的字串在同一子樹中;
- Trie 樹的核心思想是空間換時間;
- 單詞搜尋 II (Hard)
- 實現 Trie (字首樹) (Medium)
-
模版
type DisjointSet struct { fa []int } // MakeSet(s) // 建立一個新的並查集,其中包含s個集合,每個集合裡只有一個元素 func Construct(n int) DisjointSet { s := DisjointSet{fa: make([]int, n)} for i := 0; i < n; i++ { s.fa[i] = i } return s } // Find(x) // 找到元素x所在的集合的代表 // 該操作也可以用於判斷兩個元素是否位於同一個集合,只要將它們各自的代表比較一下就可以了 func (s *DisjointSet) Find(x int) int { if s.fa[x] != x { s.fa[x] = s.Find(s.fa[x]) } return s.fa[x] } // UnionSet(s) // 把元素x和元素y所在的集合合併 // 要求x和y所在的集合不相交,如果相交則無需合併 func (s *DisjointSet) Join(x, y int) { x, y = s.Find(x), s.Find(y) if x != y { s.fa[x] = y } }
省份數量(Medium)
被圍繞的區域(Medium)
-
- 冗餘連線(Medium)
- 並查集
- DFS
- 島嶼數量(Medium)
- 並查集
- DFS
- 冗餘連線(Medium)
Part 8
最短路 TODO
- 網路延遲時間(Medium)
- 閾值距離內鄰居最少的城市(Medium)
- Dijkstra 求最短路 II (Easy)(ACWing)
最小生成樹 TODO
- 連線所有點的最小費用(Medium)
-
- 字串轉換整數 (atoi) (Medium)
-
- 實現 strStr() (Easy)
- 重複疊加字串匹配(Medium)TODO
-
- 驗證迴文串(Easy)
- 驗證迴文字串 Ⅱ(Easy)(貪心 + 驗證)
- 最長迴文子串(Medium)
- 列舉中點,向兩邊擴充套件,考慮奇偶
- 二分答案 + RKHash (附帶詳細註解)
-
- 正規表示式匹配(Hard)
- 不同的子序列(Hard)
-
- 實現 strStr()(Easy)TODO
隨機練習 TODO
Part 9
-
- 括號生成(Medium)
- 剪枝:實時維護左右括號的數量,不合法及時停止
- N 皇后(Hard)
- 剪枝:維護兩種斜線(行號+列號、行號-列號)的已用值集合,排除造成重複的分支
- 有效的數獨(Medium)
- 解數獨(Hard)
- 遍歷每次找第一個空位置 VS 每次找分支較少的一個空(剪枝)
- 括號生成(Medium)
-
- 單詞接龍(Hard)
- 單向BFS
- 雙向BFS
- 單詞接龍(Hard)
-
- 滑動謎題(Hard)
- 普通BFS
- A*演算法 TODO
- 滑動謎題(Hard)
Part 10 (TODO)
END
好多TODO,加油。
本作品採用《CC 協議》,轉載必須註明作者和本文連結