算法通關面試40講


  • 如何學好數據結構?
    • 精通一個領域
      • 切碎知識點
      • 刻意練習:
        • 練習缺陷,弱點地方(練字)----不爽,枯燥,不舒服的地方----堅持,心里沒底的  
      • 反饋    
        • 主動反饋:看看高手怎么寫代碼的(自己去找)
        • 被動反饋:高手教你(別人教你)
  • 時間復雜度和空間復雜度
    • 斐波拉契數量o(2^n)----用遞歸很明顯不是最好的
    • 主定律:二分查找。二叉樹變量,排序,快排
  • LeetCode
    • 尋求反饋
  • 數組
    • 連續的存儲區域  
    • 插入,刪除O(n),查詢O(1)
  • 鏈表--改善數組的插入和刪除的時間復雜度
    • 插入和刪除O(1),查詢O(n)
    • 雙鏈表
    • 面試題:反轉鏈表
    • 面試題:兩兩反轉
    • 面試題:判斷是否有環
      • 2個指針,1個一次走一步,1個一次走兩步,相遇就有環---龜兔賽跑法
      • set 判重復   
  • 棧--先入后出
    • 插入和刪除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)  
    • 面試題:兩數之和 
      • ①--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,然后找最遲重合的父節點   
    • 二叉樹的遍歷
      • 前中后序遍歷
  • 遞歸--循環
  • 分治
    • 面試題:計算x的N次方
      • ①--調庫函數
      • ②--傻乘
      • ③---分一半--只需要計算一半--同理 
        • 非遞歸
    • 面試題:求眾數
      • ①---循環枚舉+循環計算
      • ②---map,元素:count
      • ③--sort---找重復的次數   
  • 貪心算法
    • 在問題求解時,總是做出在當前看來最好的選擇
    • 問題能分成子問題來解決,子問題的最優解能遞推到全局問題的最優解
    • 貪心問題解決不了,就用動態規划解決---多找幾種解
    • 面試題:買賣股票的最佳時機
      • ①--深度優先的搜索---
      • ②---貪心算法--后一天比前一天高就買進,第二天賣出
      • ③---動態規划--0股和1股都記錄下來---解決問題比貪心算法嚴謹
  • 廣度優先搜索:在狀態集中尋找特定節點
    • 增加一個是否已經訪問的集合
  • 深度優先算法:
    • 迷宮的走法
    • 面試題:二叉樹的層次遍歷 
      • ①---廣度優先--level加入queue
      • ②---深度優先--記住level
    • 面試題:二叉樹的最大深度和最小深度 
      • 廣度優先---記住深度--最后的深度就是最大深度--第一次到達的葉子節點就是最小深度
      • 深度優先---看是否是葉子節點,根據葉子節點的更新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皇后
  • 動態規划---動態遞推
    •        
    • 記憶化:加一個緩存
    • 從小向大遞推 
    • 面試題:爬樓梯
      • ①--回溯
      • ②--動態規划 
    • 面試題:三角形最小路徑
      • ①--動態規划--遞推
      • ②--回溯
    • 面試題:乘積最大子序列
      • 必須連在一起
      • ①:暴力求解
      • ②:動態規划遞推
    • 面試題:最長上升子序列
      • ①“---暴力求解
      • ②---到第i個元素的最大上升子序列。然后以此遞推---動態規划
    • 面試題:零錢兌換
      •  
      • 跟上台階一樣
    • 面試題:編輯距離
      •     
      • ①---動態規划--狀態前I個字符,替換前J個字符    
  • 並查集
    •    
    • 面試題:島嶼的個數
      • 1.染色,遍歷節點找出1,染色其周圍的節點變成0  
      •   

      

課程總結

  •       
  • 模板
    • 遞歸模板
      •     
    • DFS--遞歸寫法
      •     
    • BFS
      •     
    • 二分查找
      •     
    • 動態規划模板
      •    
    • 位運算
      •    
    • 練習
      •   
    • 面試
      •     
    • 面試--探討和交流,別當做是老師  
  • 最后:三分學,七分練      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM