- 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
-
-
-
-
- 方法:
-
-
-
-
-
-
- 左右根
-
-
-
-
-
-
- 應用場景
-
-
-
-
-
-
- 對某個節點進行分析時,需來自左右子樹的信息;從樹的底部不斷往上進行
-
-
-