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