- 如何學好數據結構?
- 精通一個領域
- 切碎知識點
- 刻意練習:
- 練習缺陷,弱點地方(練字)----不爽,枯燥,不舒服的地方----堅持,心里沒底的
- 反饋
- 主動反饋:看看高手怎么寫代碼的(自己去找)
- 被動反饋:高手教你(別人教你)
- 精通一個領域
- 時間復雜度和空間復雜度
- 斐波拉契數量o(2^n)----用遞歸很明顯不是最好的
- 主定律:二分查找。二叉樹變量,排序,快排
- LeetCode
- 尋求反饋
- 數組
- 連續的存儲區域
- 插入,刪除O(n),查詢O(1)
- 鏈表--改善數組的插入和刪除的時間復雜度
- 插入和刪除O(1),查詢O(n)
- 雙鏈表
- 面試題:反轉鏈表
- 面試題:兩兩反轉
- 面試題:判斷是否有環
- 2個指針,1個一次走一步,1個一次走兩步,相遇就有環---龜兔賽跑法
- set 判重復
- 2個指針,1個一次走一步,1個一次走兩步,相遇就有環---龜兔賽跑法
- 棧--先入后出
- 插入和刪除O(1),查找O(n)
- 面試題:給定一個只包含大中小括號的字符串,判斷括號是否合法
- a.左括號---push
- b.右括號---peek棧頂--pop元素
- c.堆棧必須是空的
- 時間O(n),空間O(n)
- 面試題:只用棧實現隊列
- 輸入棧:push
- 輸出棧:pop,peek
- 倒騰順序
- 面試題:只用隊列實現棧
- 與上面相反,也是兩個隊列倒騰順序
- 隊列---先入先出
- 插入和刪除O(1),查找O(n)
- 優先隊列
- 堆實現
- 二叉最小堆
- 面試題:實時判斷數據流中第K大的元素
- 1.保存K個最大值
- 優先隊列--小頂堆保存K個數據,比他小就棄了,比他大就加入堆棄掉它
- 面試題:滑動窗口最大值
- 優先隊列--大頂堆--維護堆,結果是堆頂元素
- 雙端隊列---最左邊的最大,左邊比他小的全部刪除,右邊比他小的保留
- 二叉搜索樹實現
- 堆實現
- 映射map---字典
- 解決哈希碰撞
- 哈希實現map---無序
- python本身是hashmap
- 樹實現map---有序
- 面試題:有效字母異位詞
- ①---排序--遍歷O(nlogn)
- ②---map計字母的出現次數---比較map----O(n)
- ①---排序--遍歷O(nlogn)
- 面試題:兩數之和
- ①--2個循環暴力破解
- ②--set解決---枚舉x,查詢target-x是否存在set--每次刪除x---O(n)
- 面試題:三數之和
- ①---3層循環暴力破解
- ②---暴力循環破解2次,set查詢1次
- ③---排序---枚舉A,去掉A變成兩數之和查找---其實③=②
- ④---排序--枚舉A,用兩個指針夾逼
- 集合set
- 哈希或樹實現
- 樹和圖
- 鏈表如果存在兩個next就變成了二叉樹
- 如果樹的子節點能指回去,指向父節點或其他節點就變成了圖
- 鏈表是特殊化的樹,樹是特殊化的圖
- 二叉搜索樹--有序二叉樹,左子樹小於根節點,右子樹大於根節點
- 防止退化成鏈表--只有左子樹的情況
- Java,c++實現的二叉樹都是紅黑樹
- 面試題:判斷一個樹是否是二叉排序樹
- ①---中序遍歷---升序就是二叉排序樹--每次保留前繼節點即可
- ②---遞歸查詢---左子樹最大值,右子樹最小值,跟根節點比較
- ①---中序遍歷---升序就是二叉排序樹--每次保留前繼節點即可
- 面試題:最小公共祖先
- 1.找父親節點,找到最早出現重合的父親結點
- 2.找到節點1路徑1,找到節點2的路徑2,然后找最遲重合的父節點
- 二叉樹的遍歷
- 前中后序遍歷
- 鏈表如果存在兩個next就變成了二叉樹
- 遞歸--循環
- 分治
- 面試題:計算x的N次方
- ①--調庫函數
- ②--傻乘
- ③---分一半--只需要計算一半--同理
- 非遞歸
- 面試題:求眾數
- ①---循環枚舉+循環計算
- ②---map,元素:count
- ③--sort---找重復的次數
- 貪心算法
- 在問題求解時,總是做出在當前看來最好的選擇
- 問題能分成子問題來解決,子問題的最優解能遞推到全局問題的最優解
- 貪心問題解決不了,就用動態規划解決---多找幾種解
- 面試題:買賣股票的最佳時機
- ①--深度優先的搜索---
- ②---貪心算法--后一天比前一天高就買進,第二天賣出
- ③---動態規划--0股和1股都記錄下來---解決問題比貪心算法嚴謹
- 廣度優先搜索:在狀態集中尋找特定節點
- 增加一個是否已經訪問的集合
- 深度優先算法:
- 迷宮的走法
- 面試題:二叉樹的層次遍歷
- ①---廣度優先--level加入queue
- ②---深度優先--記住level
- ①---廣度優先--level加入queue
- 面試題:二叉樹的最大深度和最小深度
- 廣度優先---記住深度--最后的深度就是最大深度--第一次到達的葉子節點就是最小深度
- 深度優先---看是否是葉子節點,根據葉子節點的更新max和min
- 廣度優先---記住深度--最后的深度就是最大深度--第一次到達的葉子節點就是最小深度
- 面試題:生成括號
- ①---數學歸納法
- ②---遞歸搜索,深度優先搜索,填格子,在判斷是否合法
- ③---改進--加入剪枝,局部不合法,左右都只能放三個
- 剪枝:搜索中用到的優化策略
- 可能沒辦法覆蓋到全部可能,根據優勝劣汰去淘汰不可能的分支
- 面試題:N皇后問題
- ①--深度優先DFS--每層枚舉Q的位置--枚舉第二層的位置,2次循環
- 暴力
- 剪枝--數組緩存--已經處理過的進行標記x+y是一個常數(撇),x-y是一個常數(啦)進行剪枝---空間換時間
- 面試題:數獨游戲
- ①--枚舉1-9,循環
- ②--剪枝--枚舉選項比較少的空格--預處理找出空格子里的可選數,從可選數從少到多進行循環
- ③--跳舞鏈表
- 二分查找:
- 面試題:求平方根
- ①---枚舉逼近+二分查找
- ②---牛頓迭代法---求切線
- 字典樹
- 用邊存,葉子節點是單詞--跟你你輸入的單詞,查找以你輸入單詞為前綴的所有詞
- 面試題:實現字典樹
- 面試題:單詞搜索
- ①--深度優先搜索DFS
- ②--形成字典樹--然后找出所有的候選詞--得到結果
- 位運算
- 面試題:為1的數
- ①---%2---count++
- ②---x&(x-1)---消掉最后的1---count++
- 面試題:是不是2的指數
- ①--%2
- ②--log2
- ③--x!=0 x&x-1=0
- 面試題:N皇后
- 面試題:為1的數
- 動態規划---動態遞推
- 記憶化:加一個緩存
- 從小向大遞推
- 面試題:爬樓梯
- ①--回溯
- ②--動態規划
- 面試題:三角形最小路徑
- ①--動態規划--遞推
- ②--回溯
- 面試題:乘積最大子序列
- 必須連在一起
- ①:暴力求解
- ②:動態規划遞推
- 面試題:最長上升子序列
- ①“---暴力求解
- ②---到第i個元素的最大上升子序列。然后以此遞推---動態規划
- 面試題:零錢兌換
- 跟上台階一樣
- 面試題:編輯距離
- ①---動態規划--狀態前I個字符,替換前J個字符
- 並查集
- 面試題:島嶼的個數
- 1.染色,遍歷節點找出1,染色其周圍的節點變成0
課程總結
- 模板
- 遞歸模板
- DFS--遞歸寫法
- BFS
- 二分查找
- 動態規划模板
- 位運算
- 練習
- 面試
- 面試--探討和交流,別當做是老師
- 遞歸模板
- 最后:三分學,七分練