leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列
生活随笔
收集整理的這篇文章主要介紹了
leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
劍指 Offer 系列完結撒花!!
本篇文章是對整個系列的精華總結, 對系列的每篇文章進行了分類, 并用一句話概括每道題的思路, 方便大家理解和記憶, 當然也包含原文完整鏈接供大家參考
總的來說, 寫這個系列耗費了我不少精力, 不過我也很開心能和大家分享, 真心希望能對大家有所幫助, 也希望大家能夠多多點贊轉發(fā)和分享, 讓更多人看到, 謝謝~
接下來我需要休整一段時間來準備新的系列了, 中間也可能會有一些不定期更新. 至于新系列是什么呢? 大家敬請期待
P.S. 公眾號即將改名為 算法精選, 更簡短和好記, 并且新加了一個暗號 劍指總結. 進入公眾號 算法精選, 在聊天框中回復 劍指總結 就能快速定位到這篇文章啦~方法 1: 記憶化搜索, 存當前長度下的最大乘積 方法 2: 找規(guī)律, 根據模 3 的結果分為 3 種情況 方法 1: 記憶化搜索, 存當前長度下的最大乘積 方法 2: 找規(guī)律, 根據模 3 的結果分為 3 種情況 方法 1: 取上限的下一個數 方法 2: 利用字符串轉換取上限數 方法 3: 利用循環(huán)求上限數 方法 1: 使用額外數組, 雙指針一前一后 方法 2: 雙指針原地交換, 向中間靠攏 方法 1: 排序后選前 k 個 方法 2: 快速排序思想 方法 3: 長度為 k 的最大堆, heapq 方法 4: 長度為 k 的最大堆, 自定義堆 方法 1: 左側最大堆+右側最小堆, heapq 方法 2: 左側最大堆+右側最小堆, 自定義堆 方法 1: 最小堆+集合, 類似 BFS 思路 方法 2: 三指針, 三個有序序列合并, 等于最小值的指針后移, 保存丑數序列 方法 1: 前 n 項和減去當前數組和 方法 2: 二分查找, 只有兩種情況, 注意初始值/循環(huán)條件/如何移動 方法 1: 滑動窗口, 維護起點/終點/當前窗口和, 根據窗口和與 target 的關系進行移動, 終點最多只需要到target // 2 + 1 方法 2: 找規(guī)律, 枚舉長度 le, 判斷 target 能否由該長度的數組求和所得, 注意 le 上限要滿足 le * (le + 1) // 2 <= target 方法 1: 遞歸 + and 的短路特性 方法 2: 前 n 項和+快速乘法, 二進制移位乘法, 同樣利用遞歸+短路特性 方法 1: split+join 方法 2: 計算替換后長度, 預分配字符數組, 雙指針 方法 1: split+join 方法 2: 從右向左遍歷, 模擬整個過程 方法 1: 字符串切片 方法 2: 逐個添加, 先添加右半部分, 再添加左半部分 方法 1: 存數組然后反轉 方法 2: 遞歸, 先調用子節(jié)點, 之后再加入結果數組中 方法 3: 輔助棧存節(jié)點, 然后循環(huán) pop 到數組中 方法 1: 存到數組里 方法 2: 計數然后正向遍歷 方法 3: 快慢指針, 快指針先遍歷 k 個然后慢指針從起點開始 方法 1: 迭代, 雙指針, 畫圖模擬, 注意初始化 方法 2: 遞歸, 返回頭尾 方法 3: 遞歸, 只返回頭 方法 1: 迭代, 雙指針, 歸并排序, 哨兵節(jié)點 方法 2: 遞歸, 傳入兩個節(jié)點, 返回歸并后的頭, 注意遞歸出口 方法 1: 使用棧模擬, 外層 for 循環(huán) pushed 數組, 內層 while 循環(huán)判斷棧頂和當前 poped 下標位置 方法 2: 將 pushed 數組作為棧, 額外記錄棧頂下標, 不使用額外空間 方法 1: 遞歸, 傳入前序/中序起點和終點, 結合{值:中序下標}快速定位根節(jié)點的中序下標位置 方法 2: 迭代, 棧存前面的節(jié)點, 分析當前節(jié)點在左還是在右 方法 1: DFS 遞歸, 原地修改 方法 2: BFS 遍歷, 無需按層遍歷, 原地修改當前 node 的左右節(jié)點 方法 1: DFS 遞歸, 先生成鏡像再逐個比較 方法 2: DFS 遞歸, 直接按照是否對稱比較 方法 3: BFS 遍歷, 存左右兩個列表, 需要存空節(jié)點 方法 1: Python 列表+for 循環(huán) 方法 2: 雙端隊列+while 循環(huán) 方法 1: 遞歸, 分治法, 快速排序思想 方法 2: 迭代, 維護單調遞增棧+根節(jié)點 方法 1: DFS, 傳入當前節(jié)點/路徑/路徑和 方法 2: BFS 存三元組(當前節(jié)點, 路徑, 路徑和) 方法 1: 遞歸分治法, 返回轉換后的鏈表頭和尾 方法 2: 中序遍歷, 存 pre 節(jié)點, 與當前節(jié)點相連 方法 1: DFS 遞歸求深度 方法 2: BFS 求層數 方法 1: 遞歸, 返回 findp 和 findq, 注意祖先只能賦值一次, 這樣才是最近的祖先 方法 2: 迭代, parent 字典+visit 集合, 找到一個在 v 集合的父節(jié)點后就直接返回, 這樣才是最近祖先 方法 1: DFS + visit 集合 方法 2: BFS + visit 集合 方法 3: DP, 如果 rc 數位和大于 k, dp[r,c] = False, 否則 dp[r,c] = dp[r-1,c] or dp[r,c-1] 方法 1: 維護當前下標和方向和 visit 集合, 逐個點遍歷 方法 2: 按層遍歷, 剝洋蔥, 注意可能不存在向左或向上的部分 方法 1: 轉二進制字符串統(tǒng)計 方法 2: 循環(huán)移位統(tǒng)計 方法 3: n &= n - 1 方法 4: n -= n & -n 方法 1: 二分分治法遞歸+記憶化搜索, 分別調用 n//2 和 n-n//2, 注意遞歸出口 方法 2: 快速冪, 奇數乘入結果, 偶數不變, 然后冪右移, 數字乘以自身
大家可以在下面這些地方找到我~
我的知乎專欄
我的頭條號
我的 CSDN
我的 Leetcode
我的牛客網博客
我的公眾號: 算法精選, 歡迎大家掃碼關注~ 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產品紅包拿不停!
本篇文章是對整個系列的精華總結, 對系列的每篇文章進行了分類, 并用一句話概括每道題的思路, 方便大家理解和記憶, 當然也包含原文完整鏈接供大家參考
總的來說, 寫這個系列耗費了我不少精力, 不過我也很開心能和大家分享, 真心希望能對大家有所幫助, 也希望大家能夠多多點贊轉發(fā)和分享, 讓更多人看到, 謝謝~
接下來我需要休整一段時間來準備新的系列了, 中間也可能會有一些不定期更新. 至于新系列是什么呢? 大家敬請期待
P.S. 公眾號即將改名為 算法精選, 更簡短和好記, 并且新加了一個暗號 劍指總結. 進入公眾號 算法精選, 在聊天框中回復 劍指總結 就能快速定位到這篇文章啦~
數字/數組
劍指 Offer 03. 數組中重復的數字 - leetcode 劍指 offer 系列
- 下標排序, 不斷循環(huán)將值放到對應下標位置, 直到發(fā)現重復
劍指 Offer 04. 二維數組中的查找 - leetcode 劍指 offer 系列
- 從左下角或右上角開始
劍指 Offer 11. 旋轉數組的最小數字 - leetcode 劍指 offer 系列
- 二分查找變種, 相等時 e-=1
劍指 Offer 14- I. 剪繩子 - leetcode 劍指 offer 系列
劍指 Offer 14- II. 剪繩子 II - leetcode 劍指 offer 系列
劍指 Offer 17. 打印從 1 到最大的 n 位數 - leetcode 劍指 offer 系列
劍指 Offer 21. 調整數組順序使奇數位于偶數前面 - leetcode 劍指 offer 系列
劍指 Offer 39. 數組中出現次數超過一半的數字 - leetcode 劍指 offer 系列
- 投票法, 記錄當前候選者和票數
劍指 Offer 40. 最小的 k 個數 - leetcode 劍指 offer 系列
劍指 Offer 41. 數據流中的中位數 - leetcode 劍指 offer 系列
劍指 Offer 43. 1 ~ n 整數中 1 出現的次數 - leetcode 劍指 offer 系列
- 十進制逐位處理, 統(tǒng)計當前位上為 1 的數字數目, 左右相乘, 根據和 1 的大小關系分三種情況
劍指 Offer 44. 數字序列中某一位的數字 - leetcode 劍指 offer 系列
- 找規(guī)律, 根據當前數字的位數, 判斷 n 所屬的范圍, 然后進一步定位對應的數字
劍指 Offer 45. 把數組排成最小的數 - leetcode 劍指 offer 系列
- 自定義排序, str(a)+str(b)<str(b)+str(a)
- 方法 1: 快排
- 方法 2: 自定義內置排序, 重寫 class 的__lt__, 然后 sorted(key = class)
劍指 Offer 49. 丑數 - leetcode 劍指 offer 系列
劍指 Offer 51. 數組中的逆序對 - leetcode 劍指 offer 系列
- 歸并排序思路, 注意逆序對不是+1, 而是加左側剩余部分
劍指 Offer 53 - I. 在排序數組中查找數字 I - leetcode 劍指 offer 系列
- 二分查找左右邊界
劍指 Offer 53 - II. 0 ~ n-1 中缺失的數字 - leetcode 劍指 offer 系列
劍指 Offer 57. 和為 s 的兩個數字 - leetcode 劍指 offer 系列
- 雙指針一前一后, 向中間靠攏
劍指 Offer 57 - II. 和為 s 的連續(xù)正數序列 - leetcode 劍指 offer 系列
劍指 Offer 59 - I. 滑動窗口的最大值 - leetcode 劍指 offer 系列
- 單調雙端隊列, 左邊存窗口最小值, 右邊存窗口最大值, 三部曲(移除左邊界=>加入右邊界=>加入結果)
劍指 Offer 61. 撲克牌中的順子 - leetcode 劍指 offer 系列
- 判斷兩個條件: 非 0 數是否有重復; 非 0 數的最大最小值差值是否小于 5
劍指 Offer 63. 股票的最大利潤 - leetcode 劍指 offer 系列
- 貪心法, 保存全局最小值, 然后每次都嘗試用當前數減去它, 求最大的差值
劍指 Offer 64. 求 1+2+…+n - leetcode 劍指 offer 系列
劍指 Offer 66. 構建乘積數組 - leetcode 劍指 offer 系列
- 左到右+右到左循環(huán), 保存前綴積數組, 然后右到左保存后綴積, 與前一個前綴積相乘即可
字符串
劍指 Offer 05. 替換空格 - leetcode 劍指 offer 系列
劍指 Offer 19. 正則表達式匹配 - leetcode 劍指 offer 系列
- 記憶化搜索, 傳入 s/p 下標判斷它們之后的子串能否匹配, 注意*和.的特殊處理
劍指 Offer 20. 表示數值的字符串 - leetcode 劍指 offer 系列
- 分析各種字符(數字/e/+/-/./空格/其他字符), 按照 e 劃分為左右兩部分
劍指 Offer 38. 字符串的排列 - leetcode 劍指 offer 系列
- getNext() 找當前字符串字典序的下一個排列, 不斷循環(huán)直到回到初始字符串
- getNext()內部邏輯: 找第一個小于后一個字符的字符, 并往后查找大于它且最小的字符進行交換, 后面部分翻轉后拼接
劍指 Offer 48. 最長不含重復字符的子字符串 - leetcode 劍指 offer 系列
- 滑動窗口+當前字符集合, 時刻更新 res
劍指 Offer 50. 第一個只出現一次的字符 - leetcode 劍指 offer 系列
- 字典記錄計數和首次出現的位置, 只需要遍歷一遍字符串
劍指 Offer 58 - I. 翻轉單詞順序 - leetcode 劍指 offer 系列
劍指 Offer 58 - II. 左旋轉字符串 - leetcode 劍指 offer 系列
劍指 Offer 67. 把字符串轉換成整數 - leetcode 劍指 offer 系列
- 分析各種字符(空白字符/數字/正負號/其他字符), 使用 isHeadBlank 和 pos 兩個 flag
鏈表
劍指 Offer 06. 從尾到頭打印鏈表 - leetcode 劍指 offer 系列
劍指 Offer 18. 刪除鏈表的節(jié)點 - leetcode 劍指 offer 系列
- 哨兵節(jié)點, pre/cur 雙指針, cur 的值等于 val 之后就 pre.next = cur.next 然后 break
劍指 Offer 22. 鏈表中倒數第 k 個節(jié)點 - leetcode 劍指 offer 系列
劍指 Offer 24. 反轉鏈表 - leetcode 劍指 offer 系列
劍指 Offer 25. 合并兩個排序的鏈表 - leetcode 劍指 offer 系列
劍指 Offer 35. 復雜鏈表的復制 - leetcode 劍指 offer 系列
- 兩次遍歷, 第一次遍歷得出映射關系, 第二次連接 random 部分
劍指 Offer 52. 兩個鏈表的第一個公共節(jié)點 - leetcode 劍指 offer 系列
- 雙指針, 遍歷到終點后換成另一個的頭繼續(xù)遍歷
- 注意一定要遍歷到空節(jié)點之后, 下次再換頭, 不然會在沒有交點的情況時進入死循環(huán)!
棧/隊列
劍指 Offer 09. 用兩個棧實現隊列 - leetcode 劍指 offer 系列
- stackIn 和 stackOut 棧, deleteHead 優(yōu)先從 out 棧中 pop, 沒有的話再從 in 棧里面倒入 out 棧, 之后再 pop
劍指 Offer 30. 包含 min 函數的棧 - leetcode 劍指 offer 系列
- 額外單調遞減棧, 當前 push 值小于等于單調棧頂時 push, 當前 pop 值等于單調棧頂時 pop
劍指 Offer 31. 棧的壓入、彈出序列 - leetcode 劍指 offer 系列
劍指 Offer 59 - II. 隊列的最大值 - leetcode 劍指 offer 系列
- 使用兩個 deque, 一個存正常的隊列, 另一個存單調隊列. push 時從一側循環(huán)移除更小值, pop 時如果和最大值相等則從另一側移除最大值
樹
劍指 Offer 07. 重建二叉樹 - leetcode 劍指 offer 系列
劍指 Offer 26. 樹的子結構 - leetcode 劍指 offer 系列
- 使用額外 match 方法傳入當前比較的兩個頭結點
劍指 Offer 27. 二叉樹的鏡像 - leetcode 劍指 offer 系列
劍指 Offer 28. 對稱的二叉樹 - leetcode 劍指 offer 系列
劍指 Offer 32 - I. 從上到下打印二叉樹 - leetcode 劍指 offer 系列
劍指 Offer 32 - II. 從上到下打印二叉樹 II - leetcode 劍指 offer 系列
- 按層 BFS, 記錄當前層長度 curlen
劍指 Offer 32 - III. 從上到下打印二叉樹 III - leetcode 劍指 offer 系列
- 按層 BFS+方向 flag
劍指 Offer 33. 二叉搜索樹的后序遍歷序列 - leetcode 劍指 offer 系列
劍指 Offer 34. 二叉樹中和為某一值的路徑 - leetcode 劍指 offer 系列
劍指 Offer 36. 二叉搜索樹與雙向鏈表 - leetcode 劍指 offer 系列
劍指 Offer 37. 序列化二叉樹 - leetcode 劍指 offer 系列
- BFS, 存節(jié)點詳細信息[當前節(jié)點下標, 父節(jié)點下標, 父節(jié)點指向方向, 節(jié)點]
劍指 Offer 54. 二叉搜索樹的第 k 大節(jié)點 - leetcode 劍指 offer 系列
- 中序遍歷翻轉, 先右子樹再根再左子樹
劍指 Offer 55 - I. 二叉樹的深度 - leetcode 劍指 offer 系列
劍指 Offer 55 - II. 平衡二叉樹 - leetcode 劍指 offer 系列
- 遞歸+全局標記, 邊求深度邊判斷, 返回深度, 全局變量標記當前是否平衡, 不平衡時直接返回 0
劍指 Offer 68 - I. 二叉搜索樹的最近公共祖先 - leetcode 劍指 offer 系列
- 根據根節(jié)點和 p/q 的值的關系來決定找到/向左/向右
劍指 Offer 68 - II. 二叉樹的最近公共祖先 - leetcode 劍指 offer 系列
圖
劍指 Offer 12. 矩陣中的路徑 - leetcode 劍指 offer 系列
- DFS, 找有效起點, 記錄當前路徑, 使用 visit 集合或改變原數組的值來標記已經遍歷的點
劍指 Offer 13. 機器人的運動范圍 - leetcode 劍指 offer 系列
劍指 Offer 29. 順時針打印矩陣 - leetcode 劍指 offer 系列
位運算
劍指 Offer 15. 二進制中 1 的個數 - leetcode 劍指 offer 系列
劍指 Offer 16. 數值的整數次方 - leetcode 劍指 offer 系列
劍指 Offer 56 - I. 數組中數字出現的次數 - leetcode 劍指 offer 系列
- 其他數字出現偶數次, 某兩個數字各出現奇數次 => 異或后根據異或結果的某個 1 分兩類
劍指 Offer 56 - II. 數組中數字出現的次數 II - leetcode 劍指 offer 系列
- 其他數字出現奇數次, 某個數字出現 1 次 => 按照二進制每一位統(tǒng)計次數, 然后對這個奇數次取模
劍指 Offer 65. 不用加減乘除做加法 - leetcode 劍指 offer 系列
- 利用 (a&b)<<1 求進位, 利用 a^b 求無進位和, 兩者賦值為新的 a 和 b 不斷循環(huán), 直到進位為 0 即可, 注意 python 負數的處理
動態(tài)規(guī)劃
劍指 Offer 10- I. 斐波那契數列 - leetcode 劍指 offer 系列
- 兩變量動態(tài)規(guī)劃, 存前兩個值, 當前值為它們的和
劍指 Offer 10- II. 青蛙跳臺階問題 - leetcode 劍指 offer 系列
- 兩變量動態(tài)規(guī)劃, 存前兩個值, 當前值為它們的和, 與上一題唯一區(qū)別是初始化不同
劍指 Offer 42. 連續(xù)子數組的最大和 - leetcode 劍指 offer 系列
- 動態(tài)規(guī)劃+空間優(yōu)化, dp 存當前數字結尾的最大和, dp = max(dp + x, x)
劍指 Offer 46. 把數字翻譯成字符串 - leetcode 劍指 offer 系列
- 動態(tài)規(guī)劃, dp[i]代表末尾第 i 位時可以翻譯的字符串數目, dp[i] = dp[i-2] (使用2個字符) + dp[i-1] (使用1個字符) if 10 <= int(s[i - 1:i + 1]) <= 25 else dp[i-1]
劍指 Offer 47. 禮物的最大價值 - leetcode 劍指 offer 系列
- 動態(tài)規(guī)劃, dp[r,c]代表格子(r,c)所能獲得的最大價值, dp[r,c] = max(dp[r-1,c], dp[r,c-1]) + grid[r][c] (r-1>=0 and c-1>=0)
劍指 Offer 60. n 個骰子的點數 - leetcode 劍指 offer 系列
- 動態(tài)規(guī)劃+空間優(yōu)化, dp 存當前骰子數下面的所有可能取值的概率, 推導出骰子數+1 的所有概率
劍指 Offer 62. 圓圈中最后剩下的數字 - leetcode 劍指 offer 系列
- 動態(tài)規(guī)劃+空間優(yōu)化, 反推, dp[n, m] = (dp[n-1,m]+m)%n, 遍歷[2,n], 注意推導過程
大家可以在下面這些地方找到我~
我的知乎專欄
我的頭條號
我的 CSDN
我的 Leetcode
我的牛客網博客
我的公眾號: 算法精選, 歡迎大家掃碼關注~ 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產品紅包拿不停!
總結
以上是生活随笔為你收集整理的leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输出以下图案菱形7行_华丽大气的手工围巾
- 下一篇: python大神的成长之路_Python