LeetCode 解題思路:Remove Duplicates from Sorted List(刪除排序鏈表中的重複元素) 題目描述 給定一個已排序的鏈表的頭節點 head,刪除所有重複的元素,使每個元素只出現一次。返回已排序的鏈表。
範例 範例 1:
輸入:head = [1,1,2] 輸出:[1,2] 視覺化: 1 → 1 → 2 → null ↓ 1 → 2 → null範例 2:
輸入:head = [1,1,2,3,3] 輸出:[1,2,3] 視覺化: 1 → 1 → 2 → 3 → 3 → null ↓ 1 → 2 → 3 → null限制條件 鏈表中的節點數在範圍 [0, 300] 內 -100 <= Node.val <= 100 題目保證鏈表是按升序排列的 核心概念 1. 問題本質分析 關鍵觀察:
已排序:相同的元素一定相鄰 刪除重複:保留第一個,刪除後續重複的 原地修改:不需要創建新鏈表 2.
LeetCode 解題思路:Merge Sorted Array(合併兩個有序數組) 題目描述 給你兩個按非遞減順序排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n,分別表示 nums1 和 nums2 中的元素數目。
請你合併 nums2 到 nums1 中,使合併後的數組同樣按非遞減順序排列。
注意:最終的排序數組不應由函數返回,而是儲存在數組 nums1 中。為了應對這種情況,nums1 的初始長度為 m + n,其中前 m 個元素表示應合併的元素,後 n 個元素為 0,應忽略。nums2 的長度為 n。
範例 範例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合併 [1,2,3] 和 [2,5,6] 結果是 [1,2,2,3,5,6]範例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合併 [1] 和 [] 結果是 [1]範例 3:
LeetCode 解題思路:Binary Tree Inorder Traversal(二叉樹的中序遍歷) 題目描述 給定一個二叉樹的根節點 root,返回它的中序遍歷。
範例 範例 1:
輸入:root = [1,null,2,3] 1 \ 2 / 3 輸出:[1,3,2]範例 2:
輸入:root = [] 輸出:[]範例 3:
輸入:root = [1] 輸出:[1]限制條件 樹中節點數目在範圍 [0, 100] 內 -100 <= Node.val <= 100 進階:遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
核心概念 1. 什麼是中序遍歷? 中序遍歷(Inorder Traversal)的順序是:左子樹 → 根節點 → 右子樹
對於二叉樹: 4 / \ 2 6 / \ / \ 1 3 5 7 中序遍歷順序:1 → 2 → 3 → 4 → 5 → 6 → 7 (注意:對於二叉搜索樹,中序遍歷會得到升序序列)2.
Tree(樹)資料結構完整教學 什麼是樹? 樹(Tree)是一種非線性的階層式資料結構,由節點(nodes)和邊(edges)組成。樹模擬了現實世界中的階層關係,如組織架構、檔案系統、決策過程等。
樹的基本概念 A <- 根節點 (Root) / | \ B C D <- 內部節點 (Internal Nodes) /| \ E F G <- 葉節點 (Leaf Nodes)重要術語 節點(Node):樹的基本單位,包含資料和指向其他節點的連結 根(Root):樹的最頂層節點,沒有父節點 父節點(Parent):有子節點的節點 子節點(Child):從屬於另一個節點的節點 葉節點(Leaf):沒有子節點的節點 兄弟節點(Siblings):有相同父節點的節點 深度(Depth):從根到該節點的邊數 高度(Height):從該節點到最深葉節點的邊數 子樹(Subtree):節點及其所有後代組成的樹 二元樹(Binary Tree) 二元樹是每個節點最多有兩個子節點的樹結構。
基本實作 class TreeNode: """二元樹節點""" def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def __repr__(self): return f"TreeNode({self.val})" class BinaryTree: """二元樹基本實作""" def __init__(self): self.root = None def __repr__(self): if not self.
LeetCode 解題思路:Climbing Stairs(爬樓梯) 題目描述 你正在爬樓梯。需要 n 階才能到達樓頂。
每次你可以爬 1 或 2 個台階。有多少種不同的方法可以爬到樓頂?
範例 範例 1:
輸入:n = 2 輸出:2 解釋:有兩種方法可以爬到樓頂 1. 1 階 + 1 階 2. 2 階範例 2:
輸入:n = 3 輸出:3 解釋:有三種方法可以爬到樓頂 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階限制條件 1 <= n <= 45 核心概念 1. 問題本質分析 這是一個經典的動態規劃入門題。關鍵洞察:
到達第 n 階的方法數 = 到達第 (n-1) 階的方法數 + 到達第 (n-2) 階的方法數
LeetCode 解題思路:Sqrt(x)(平方根) 題目描述 給定一個非負整數 x,返回 x 的平方根,結果向下取整到最接近的整數。返回的整數必須是非負的。
限制:你不能使用任何內建的指數函數或運算子。
例如,在 C++ 中不能使用 pow(x, 0.5) 在 Python 中不能使用 x ** 0.5 範例 範例 1:
輸入:x = 4 輸出:2 解釋:4 的平方根是 2,所以返回 2範例 2:
輸入:x = 8 輸出:2 解釋:8 的平方根是 2.82842...,向下取整後返回 2限制條件 0 <= x <= 2³¹ - 1 核心概念 1. 問題本質分析 這道題本質上是要找到一個最大的整數 ans,使得 ans² <= x。
換句話說,我們要找到滿足以下條件的最大整數:
ans * ans <= x (ans + 1) * (ans + 1) > x 2. 為什麼適合用二分搜尋? 關鍵洞察:平方根函數是單調遞增的!