數據結構與算法 - 基礎數據結構

  • 1. 數組 Array
    • 優點
      • 構建非常簡單
      • 能再 O(1) 的時間裏根據數據的下標 (index) 查詢某個元素
    • 缺點
      • 構建時必須分配一段連續的空間
      • 查詢某個元素是否存在時,需遍歷整個數組 O(1)
      • 刪除和添加時,耗時 O(1)
    • 應用場景
      • 元素大小確定,刪除插入不多
      • 根據下標查詢數據
    • 練習
      • LC242:兩個字符串 s t,判斷 t 是否是 s 的字母異位詞 (字母相同,順序不同)
  • 2. 鏈表 LinkedList
    • 優點
      • 靈活地分配內存空間
      • O(1) 時間內 刪除或添加元素,前提:該元素的前一個元素已知【雙鏈表 可以是後一元素】
    • 缺點
      • 不像數組能通過下標迅速讀取元素,每次都要從鏈表頭開始一個個讀取
      • 查詢第 k 個元素需要 O(k) 時間
    • 應用場景
      • 元素個數不確定,且需要經常添加和刪除
    • 練習 - 使用快慢指針 三指針
      • 鏈表的翻轉;尋找倒數第 K 個元素;尋找鏈表中間元素;鏈表是否有環
      • LC25:給你一個鏈表,每 k 個節點一組進行翻轉,返回翻轉後的鏈表
  • 3. Stack
    • 特點
      • 後進先出 LIFO;所有的操作都在棧頂完成
      • 只能查看棧頂元素;只能向棧頂插入、彈出數據
    • 實現
      • 利用 單鏈表 實現
      • 借用單鏈表的頭,就能讓所有棧操作在 O(1) 時間內完成
    • 應用場景
      • 只關心最近一次的操作,且操作完成後,向前查找更前一次的操作
    • 注意
      • 若用一個數組 + 一個指針來實現,一旦數組長度發生變化,時間複雜度都不再是 O(1),空間複雜度也得不到優化
    • 練習
      • LC20:給定只包含 (){}[] 的字符串,判斷字符串是否匹配
      • LC739:根據氣溫列表,重新生成一個列表,對應位置的輸入是你需要再等待多久溫度纔會升高超過該日的天數。如果之後都不會升高,請在該位置用 0 來代替
        • 給定 T[23, 25, 21, 19, 22, 26, 23]
        • 返回 D: [ 1, 4, 2, 1, 1, 0, 0]
  • 4.1 隊列 Queue
    • 特點
      • 先進先出 FIFO
      • 隊尾查看 添加 數據,對頭查看 刪除 數據
    • 實現
      • 雙鏈表
      • 雙鏈表的 頭指針 允許在隊頭查看 刪除數據
      • 雙鏈表的尾指針 允許在隊尾查看 添加數據
    • 應用場景
      • 需要按照一定的順序來處理數據,而該數據的數據量在不斷地變化的時候
      • 廣度優先搜索 Breadth-First-Search
    • 練習
      • LC239:給一數組 nums,有一大小爲 k 的滑動窗口從數組的最左側移到數組的最右側。你只可以看到在滑動窗口 k 內的數字,滑動窗口每次只向右移動一位。返回滑動窗口最大值
        • 輸入:nums = [1, 3, -1, -3, 5, 3, 6, 7]k = 3
        • 輸出:[3, 3, 5, 5, 6, 7]
  • 4.2 雙端隊列 Deque
    • 特點
      • 允許在隊列的頭尾兩端,在 O(1) 時間內進行數據的 查看、添加 刪除
    • 實現
      • 雙鏈表
    • 應用場景
      • 實現一個長度動態變化的窗口 或者 連續區間
  • 5. Tree
    • 常用樹
      • 普通二叉樹、平衡二叉樹、完全二叉樹、二叉搜索樹、四叉樹(Quadtree)、多叉樹(N-ary Tree)
    • 特殊樹 - 不常考
      • 紅黑樹(Red-Black Tree)、自平衡二叉搜索樹(AVL Tree)
    • 考點
      • 樹的遍歷、序列化(serialization)
    • 樹的遍歷
      • a) 前序遍歷 Preorder Traversal
        • 方法:
          • 根左右
        • 應用場景
          • 運用最多:樹中進行搜索 以及 創建一棵新樹
      • b) 中序遍歷 Inorder Traversal
        • 方法:
          • 左根右
        • 應用場景
          • 二叉搜索樹:左孩子小於根節點,根節點小於右孩子
          • 二叉搜索樹 排序:按照中序遍歷,得到從小到大排列
      • c) 後序遍歷 Postorder Traversal
        • 方法:
          • 左右根
        • 應用場景
          • 對某個節點進行分析時,需來自左右子樹的信息;從樹的底部不斷往上進行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章