【LeetCode 总结】Leetcode 题型分类总结、索引与常用接口函数
文章目錄
- 零. Java 常用接口函數
- 一. 動態規劃
- 二. 鏈表
- 三. 哈希表
- 四. 滑動窗口
- 五. 字符串
- 六. DFS、BFS
- 七. 二分法
- 八. 二叉樹
- 九. 偏數學、過目不忘 and 原地算法等
- 十. 每日一題
前言:
是時候開一個對于我的 LeetCode 專欄的總結索引了= =
雖然說大概只刷了150道左右,不過應該也可以簡單總結一下了!
題型主要是 LeetCode hot100 + 劍指Offer,也有其他的一些高頻題
每日一題持續更新中
零. Java 常用接口函數
集合類
/*** tip 1:注意多態情況下,只能用父類函數;想要用子類獨占函數,就得用子類聲明**/// 1. ArrayList list.add(element); // 加到尾部 list.size();List<int[]> list = new ArrayList<>(); int[][] arr = list.toArray(new int[list.size()][2]); // 鏈表 -> 數組 list = Arrays.asList(arr); // 數組 -> 鏈表 queue.stream().mapToInt(Integer::valueOf).toArray(); // Integer -> int// 2. LinkedList list.add(element); // 加到尾部 list.addFirst(element); // 加到頭部list.removeFirst(); list.removeLast();list.getFirst(); list.getLast();// 3. Deque:雙向隊列(注意:不能加入 null 元素,而 LinkedList 可以) Deque<Integer> deque = new ArrayDeque<>(); // ArrayDeque 可以作為隊列、棧來用,效率都更高 deque.offerFirst(element); // 加隊頭 or 加隊尾 deque.offerLast(element); // 也可以換成 addFirst、addLastdeque.pollFirst(); // 出隊頭 or 出隊尾(會返回元素) deque.pollLast(); // 也可以換成 removeFirst、removeLastdeque.getFirst(); deque.getLast();// 4. HashMap hashmap.put(k, v); hashmap.get(k); // 獲取 k 對應的 v hashmap.size(); hashmap.isEmpty(); hashmap.containsKey(key1); // 判斷 key1 是否存在 hashmap.containsValue(value1); // 判斷 value1 是否存在// 5. HashSet hashset.add(element); hashset.contains(element); hashset.remove(element); hashset.size()// 6. Stack stack.push(); stack.pop(); stack.peek(); stack.isEmpty();// 7. PriorityQueue 優先隊列(堆) // 知識點:小頂堆存較大值,大頂堆存較小值(便于維護) // 注意:泛型函數的 Labmda 表達式需要注明類型(如下) PriorityQueue<Integer> queue = new PriorityQueue<>((Integer a, Integer b) -> (a - b));數學類
Math.max(num1, num2); // 取最大值 Math.min(num1, num2); // 取最小值 Arrays.sort(arr); // 排序數組 Arrays.sort(arr, (a, b) -> (a[0) - b[0])) // 自定義排序方式的 sort字符串
// String char[] arr = s.toCharArray(); // 轉化成字符數組,提高 String s2 = s1.substring(0, 3); // 截取,閉開區間[0,3) char c = s1.charAt(1); // 選取元素,效率比較慢 s.length(); // 用函數獲取長度,數組則直接 arr.length s.split(",")// 分割字符串,返回字符串數組(注意不能用".")int num = Integer.parseInt(s); // String 轉換成 int String s1 = Integer.toString(num); // int 轉換成 String String s2 = "" + num; // 也可以這樣做// StringBuilder:這里的 leetcode 都是單線程,因此不涉及 StringBuffer sb.append("abc"); // 添加到尾 sb.delete(1, 3); // 刪除,閉開區間[1, 3)的元素 sb.deleteCharAt(index); // 刪除下標元素一. 動態規劃
考察的大頭了,大部分題目都用的這玩意
知識點
- 三要素:邊界處理、最優子結構、狀態轉移方程
- 滾動數組:用于節約空間復雜度,可能需要通過逆序處理來實現無后效性
- 樹形dp:樹結構的dp
- 數位dp:對象是數字的各個位的dp
- 01背包問題:取 or 不取的背包問題
- 主要就是:如何找出三要素
- O(1) 空間復雜度:邏輯上的數組,有時可以直接通過幾個變量實現
題目
5.最長回文子串(字符串)
42. 接雨水(常考的 hard,思路還是挺好用的,在后面刷題也有類似的做法)
32. 最長有效括號(算是比較有難度的 hard 了,需要細分很多情況,考慮邊界)
53. 最大子序和(常考 easy 題,思路還是很值得學習的:負收益舍棄)
128. 最長連續序列(哈希表)(被字節面過)
62. 不同路徑(dp入門題)
64. 最小路徑和(同上)
70. 爬樓梯(同上)
96. 不同的二叉搜索樹(有點東西的,空樹也算一種樹,方程推導思路也值得學習,容易忘)
309. 最佳買賣股票時機含冷凍期(分狀態,股票系列)
312. 戳氣球(很有意思的一道題,狀態考慮的思路很nice)
121 / 劍指 Offer 63. 買賣股票的最佳時機
198. 打家劫舍
213. 打家劫舍 II
337. 打家劫舍 III(樹形 DP)
221. 最大正方形(思路題)
279. 完全平方數(思路題)
322. 零錢兌換(和上面的279思路很像,這題麻煩點)
338. 比特位計數(位運算)
1143. 最長公共子序列(字符串)
139. 單詞拆分(字符串)
劍指 Offer 10-I. 斐波那契數列
劍指 Offer 60. n個骰子的點數
劍指 Offer 46. 把數字翻譯成字符串
劍指 Offer 47. 禮物的最大價值
劍指Offer 43. 1~n 整數中1出現的次數(數位dp)
劍指Offer 19. 正則表達式匹配
72. 編輯距離(字符串)
————————【背包】————————————
416. 分割等和子集(背包、滾動數組)
494. 目標和(背包、滾動數組)
二. 鏈表
知識點
- 這塊主要是鏈表結點之間關系的處理
- 頭結點、尾結點的邊界處理也要注意,小心空指針!
題目
2.兩數相加
21. 合并 2 個有序鏈表
23. 合并 K 個升序列表(歸并、分治)(很清晰的一道 hard,有前導題 合并 2 個有序鏈表)
19.刪除鏈表的倒數第N個結點(快慢指針)
146. LRU緩存機制(手寫雙向鏈表 + 調庫HashMap,注意結點關系處理)
160. 相交鏈表(原地算法,有點偏數學)
206. 反轉鏈表 (遞歸 or 迭代,常考題了)
25. K個一組翻轉鏈表(遞歸)(相當于 206.反轉鏈表 + 遞歸)
141. 環形鏈表(快慢指針)
142. 環形鏈表 II(快慢指針,公式)
206. 反轉鏈表(遞歸 + 迭代兩種做法)
234. 回文鏈表(反轉 + 快慢指針)
160. 相交鏈表
143. 重排鏈表(快慢指針,翻轉鏈表)
148. 排序鏈表(雙重遞歸、快慢指針、合并有序鏈表)
劍指 Offer 06. 從尾到頭打印鏈表
劍指 Offer 35. 復雜鏈表的復制(哈希表、原地算法)
三. 哈希表
知識點
- HashMap 可以存 null 作為鍵值
- 查詢復雜度 O(1)
題目
1.兩數之和
四. 滑動窗口
知識點
- 感覺這類題型,大多應用主體都是字符串呀!
- 主要涉及到幾點操作:滑動窗口怎么拓增、縮小、移動
題目
3.無重復字符的最長字串(HashMap)
76. 最小覆蓋子串(和上面的3很像)
438. 找到字符串中所有字母異位詞
劍指 Offer 57- II. 和為 s 的連續正數序列
76. 最小覆蓋子串(字符串)
五. 字符串
當然,涉及字符串的很多題目也會在四.滑動窗口、一. 動態規劃中出現,這里不重復列出題目啦~
知識點
- 寫這里的題目,要對 String、StringBuilder 的庫函數有一定了解噢~
題目
49. 字母異位詞分組
20. 有效的括號(棧)
415. 字符串相加
394. 字符串解碼
劍指 Offer 58 - I. 翻轉單詞順序(雙指針)
劍指 Offer 67. 把字符串轉換成整數
六. DFS、BFS
知識點
- DFS:一路到底!
- BFS:用到隊列,一層一層地跑完
- 剪枝:通過限定條件,減少需要遞歸的枝條,提高效率
- boolean[] visited:訪問數組,用于遞歸中記錄是否訪問過。一般會涉及回滾
題目
46. 全排列(DFS、隊列)
39. 組合總和(DFS、隊列)
22. 括號生成(DFS、剪枝)
17. 電話號碼的字母組合(DFS)
78. 子集(DFS)
79. 單詞搜索 && 劍指 Offer 12 矩陣中的路徑(DFS)
301. 刪除無效的括號(DFS,字符串)
200. 島嶼數量(DFS)
劍指 Offer 13-. 機器人的運動范圍(DFS,和島嶼問題一樣用的感染方法呢!)
劍指 Offer 38. 字符串的排列(字符串)
劍指 Offer 93. 復原 IP 地址(字符串)
51. N 皇后(字符串、經典題)
207. 課程表(圖、BFS)
399. 除法求值(圖、BFS)
七. 二分法
誒,二分法在 leetcode 題庫里還是有一席之地的,要學好也得多實踐噢~
知識點
- 二分法和時間復雜度O(logN)掛鉤!
- 注意邊界,小心死循環!
- 分區 [left, mid],[mid + 1, right],注意 mid 的取值(向上 or 向下)
- while(left < right) 循環中,分兩種情況、還是三種情況(大于、等于、小于)
題目
34. 在排序數組中查找元素的第一個和最后一個位置
33. 搜索螺旋排序數組
4. 尋找兩個正序數組的中位數(二分排除)
69. x 的平方根
35. 搜索插入位置(內附二分法總結)
162. 尋找峰值
八. 二叉樹
知識點
- 搜索二叉樹:左子樹均小于根,右子樹均大于根
- 完全二叉樹:倒數第二層結點全滿
- 滿二叉樹:倒數第一層結點全滿
- 自底向上:從上往下遞歸,再從下往上收束結果(比如114. 二叉樹展開為鏈表)
- 自頂向下:從上往下,不用返回結果來收束(如 104. 二叉樹的最大深度)
- 做二叉樹的題目時,多半用到遞歸,那么可以多總結一下自底向上、自頂向下的情況。遇到題目的時候先分析是哪一種,再回憶一下常用的處理思路。
題目
102. 二叉樹的層序遍歷(DFS + 隊列即可)
94 & 144 & 145. 二叉樹的前序、中序、后序遍歷(迭代用棧,后序新增pre結點)
98. 驗證二叉搜索樹(DFS、中序遍歷)(pre + 中序,保證當前最左邊 && 次左邊對比
101. 對稱二叉樹(遞歸)
102. 層序遍歷(隊列、遞歸)
劍指 Offer 55 - II. 平衡二叉樹(DFS)
104. 二叉樹的最大深度(DFS)
105. 從前序與中序遍歷序列構造二叉樹(哈希表、遞歸)(還有前后、中后的題,要多看
114. 二叉樹展開為鏈表(鏈表、遞歸、自底向上)
617. 合并二叉樹(DFS)
226. 翻轉二叉樹(DFS、自頂向下 || 自底向上)
543. 二叉樹的直徑(DFS、自底向上)
124. 二叉樹中的最大路徑和(自底向上 DFS)
236. 二叉樹的最近公共祖先(自底向上)
劍指 Offer 68 - I. 二叉搜索樹的最近公共祖先
538. 把二叉搜索樹轉換為累加樹(自底向上)
112. 路徑總和 I
113. 路徑總和 II
437. 路徑總和 III(雙重遞歸)
劍指 Offer 26-. 樹的子結構 (雙重遞歸
劍指 Offer 33. 二叉樹的后序遍歷序列(輔助棧)
劍指 Offer 36. 二叉搜索樹與雙向鏈表(鏈表、原地算法)
117. 填充每個節點的下一個右側節點指針 II(原地)
208. 實現 Trie(前綴樹)
958. 二叉樹的完全性檢驗(BFS)
199. 二叉樹的右視圖(BFS)
劍指Offer 37. 序列化二叉樹(隊列、字符串)
九. 偏數學、過目不忘 and 原地算法等
這一塊是記錄那些比較偏數學,或者容易初見殺,但是實際代碼量不多 or 寫過一遍就忘不掉思路的題目。
知識點
- 原地算法:O(1)空間復雜度,要求原地的題目不少,看看能不能總結點規律出來
題目
55. 跳躍游戲(貪心法)
48. 旋轉圖像(原地算法、矩陣轉置)
15. 三數之和(雙指針)
11. 盛最多水的容器(雙指針)
7. 整數反轉(對溢出判斷的做法,很值得學習!)
6. Z字形變化(主要考察思路的一道題,思路比較獨特,類似壓縮)
56. 合并區間(雙指針,排序)(用了一波 Arrays.sort(arr, Lambda),還有鏈表 - 數組轉化)
84. 柱狀圖中最大的矩形(單調棧)
85. 最大矩形(用到84,動態規劃)
406. 根據身高重建隊列(逆序排 + 正序排)
253. 會議室(上下車問題)
169. 多數元素(摩爾投票法)
155. 最小棧(棧)
劍指 Offer 59 - II. 隊列的最大值(最大隊列,和最小棧差不多)
283. 移動零
470. 用Rand7()實現Rand10()(常考題、代碼少)
461. 漢明距離(位運算)
347. 前K個高頻元素(優先隊列)
263. 丑數
232. 用棧實現隊列
225. 用隊列實現棧(類似 GC 復制算法)
88. 合并兩個有序數組(雙指針)
劍指 Offer 21-. 調整數組順序使奇數位于偶數前面(雙指針)
劍指 Offer 61-. 撲克牌中的順子(哈希表)
劍指 Offer 65. 不用加減乘除做加法(位運算)
劍指 Offer 64. 求1 + 2 + … + n(限制語法、二刷)
劍指 Offer 31. 棧的壓入、彈出序列
劍指 Offer 16. 數值的整數次方(分治)
劍指 Offer 45. 把數組排成最小的數(Lambda)
劍指 Offer 14. 剪繩子 I、II(動態規劃、數學方法)
621. 任務調度器(桶)
- 找數合集:
劍指 Offer 03. 數組中重復的數字(原地)數組轉換成邏輯上的哈希表,很有意思
136. 只出現一次的數字(位運算)亦或性質:同數得0,與0不變
劍指 Offer 56 . 數組中數字出現的次數(類似上面的136,但是要復雜一點)
448. 找到所有不存在的數(原地) 數組常用的取負、取余處理
287. 尋找重復數(原地)轉換成邏輯上的鏈表,再進行找入環點操作(環形鏈表II的兄弟題目
26. 刪除有序數組中的重復項(原地)挺簡單的。。逐個推就行
152. 乘積最大子數組(重要)(記錄 iMax、iMin,根據新值決定交換 or 更新成當前值)
215. 數組中的第K個最大元素(TOP K,快排、堆排)
240. 搜索二維矩陣II
238. 除自身以外數組的乘積
27. 移除元素(原地)
41. 缺失的第一個正數(構建哈希)
54. 螺旋矩陣
560. 和為 k 的子數組(前綴和,哈希表)
劍指 Offer 15-. 二進制中1的個數(位運算)
劍指 Offer 57-. 和為s的兩個數字(對撞雙指針)
劍指 Offer 62. 圓圈中最后剩下的數字(約瑟夫環、數學方法)
31. 下一個排列(原地)
劍指Offer 51. 數組中的逆序對(歸并排序)
劍指Offer 59. I 滑動窗口的最大值(單調隊列)
劍指Offer 41. 數據流中的中位數(優先隊列,堆)
581. 最短無序連續子數組
十. 每日一題
閑著也是閑著,不如打打每日,圖個新鮮!
比較簡單的題就直接放題目地址了,有點意思的就寫篇博客記錄!
500. 鍵盤行(打表題,這里直接用 Map 映射就行)
575. 分糖果(用 Set,然后理清楚問題本質即可,四行代碼解決)
367. 有效的完全平方數(二分法 or 數學公式)
268. 丟失的數字(還不錯!用的異或很巧妙)
598. 范圍求和 II(思路轉移)
299. 猜數字游戲(巧妙代碼塊)
495. 提莫攻擊(一開始求穩想模擬,但實際上正常循環即可)
375. 猜數字游戲 II(DFS、動態規劃,有點像猜氣球)
319. 燈泡開關(一行流,純數學題。模擬反而超時,我覺得模擬意義還更大…)
318. 最大單詞長度乘積(還不錯!位運算)
563. 二叉樹的坡度(二叉樹遞歸題,還行)
397. 整數替換(DFS,其實位運算更高效,偷懶了)
594. 最長和諧子序列(滑動窗口,感覺其實可以 mid)
559. N 叉樹的最大深度(DFS,和二叉樹最大深度沒啥區別…)
384. 打亂數組(洗牌算法)
859. 親密字符串(分好情況就行= =)
423. 從英文中重建數字(字符串、偏思路)
700. 二叉搜索樹中的搜索(簡單DFS,三行寫完)
519. 隨機翻轉矩陣(雙指針、隨機)
1446. 連續字符(簡單題我重拳出擊)
506. 相對名次(哈希表)
383. 贖金信(簡單題我重拳出擊)
1816. 截斷句子(轉化成循環問題即可)
794. 有效的井字游戲(分好情況即可)
709. 轉換成小寫字母(接口題)
1518. 換酒問題(先換再喝,注意結束條件)
419. 甲板上的戰艦(類似島嶼數量,進階做法也只是修改一下即可)
1609. 奇偶樹(BFS)
1078. Bigram 分詞(跑一次遍歷就行)
89. 格雷編碼(三行代碼,板子題;通信使用,優點)
1629. 按鍵持續時間最長的鍵(題干最啰嗦的easy題…)
334. 遞增的三元子序列(300的兄弟題,偏思路)
373. 查找和最小的 K 對數字(堆、優先隊列)
1716. 計算力扣銀行的錢(公式題,等差數列)
總結
以上是生活随笔為你收集整理的【LeetCode 总结】Leetcode 题型分类总结、索引与常用接口函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode笔记】136. 只出现
- 下一篇: 【学习笔记】第三章——内存 III(分段