docs: 改进LeetCode二叉树题目解题思路
按照改进方案,为以下6个二叉树题目增强了解题思路的详细程度: 1. 二叉树的中序遍历 - 增加"思路推导"部分,解释递归到迭代的转换 - 详细说明迭代法的每个步骤 - 增加执行过程演示和多种解法 2. 二叉树的最大深度 - 增加"思路推导",对比DFS和BFS - 详细解释递归的基准情况 - 增加多种解法和变体问题 3. 从前序与中序遍历序列构造二叉树 - 详细解释前序和中序的特点 - 增加"思路推导",说明如何分治 - 详细说明切片边界计算 4. 对称二叉树 - 解释镜像对称的定义 - 详细说明递归比较的逻辑 - 增加迭代解法和变体问题 5. 翻转二叉树 - 解释翻转的定义和过程 - 详细说明多值赋值的执行顺序 - 增加多种解法和有趣的故事 6. 路径总和 - 详细解释路径和叶子节点的定义 - 说明为什么使用递减而非累加 - 增加多种解法和变体问题 每个文件都包含: - 完整的示例和边界条件分析 - 详细的算法流程和图解 - 关键细节说明 - 常见错误分析 - 复杂度分析(详细版) - 执行过程演示 - 多种解法 - 变体问题 - 总结 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,6 +31,95 @@
|
||||
- `2 <= n <= 10^5`
|
||||
- `0 <= height[i] <= 10^4`
|
||||
|
||||
## 思路推导
|
||||
|
||||
### 暴力解法分析
|
||||
|
||||
**最直观的思路**:枚举所有可能的线对,计算每对线构成的容器容量。
|
||||
|
||||
```python
|
||||
def maxArea(height):
|
||||
max_water = 0
|
||||
n = len(height)
|
||||
|
||||
for i in range(n):
|
||||
for j in range(i+1, n):
|
||||
# 容量 = 宽度 × 高度
|
||||
width = j - i
|
||||
h = min(height[i], height[j])
|
||||
max_water = max(max_water, width * h)
|
||||
|
||||
return max_water
|
||||
```
|
||||
|
||||
**时间复杂度**:O(n²)
|
||||
- 外层循环:O(n)
|
||||
- 内层循环:O(n)
|
||||
- 总计:O(n) × O(n) = O(n²)
|
||||
|
||||
**空间复杂度**:O(1)
|
||||
|
||||
**问题分析**:
|
||||
1. 效率低:n=10⁵ 时,n² 不可接受
|
||||
2. 重复计算:很多组合明显不可能最优
|
||||
3. 无法利用单调性优化
|
||||
|
||||
### 优化思考 - 第一步:双指针策略
|
||||
|
||||
**观察**:容器的容量由 `min(height[left], height[right]) × (right - left)` 决定
|
||||
|
||||
**关键问题**:如何移动指针才能找到更大的容量?
|
||||
|
||||
**直觉思考**:
|
||||
- 如果移动较高的指针,宽度减小,高度只能保持不变或减小
|
||||
- 如果移动较短的指针,虽然宽度减小,但可能会找到更高的线
|
||||
|
||||
**为什么这样思考?**
|
||||
- 容量受限于较短的线
|
||||
- 移动较短的线才有可能增加容量
|
||||
- 移动较高的线不可能增加容量
|
||||
|
||||
**优化后的思路**:
|
||||
```python
|
||||
left, right = 0, len(height) - 1
|
||||
max_water = 0
|
||||
|
||||
while left < right:
|
||||
width = right - left
|
||||
h = min(height[left], height[right])
|
||||
max_water = max(max_water, width * h)
|
||||
|
||||
# 移动较短的指针
|
||||
if height[left] < height[right]:
|
||||
left += 1
|
||||
else:
|
||||
right -= 1
|
||||
```
|
||||
|
||||
**时间复杂度**:O(n)
|
||||
- 每次移动一个指针
|
||||
- 最多移动 n 次
|
||||
- 总计:O(n)
|
||||
|
||||
### 优化思考 - 第二步:数学证明
|
||||
|
||||
**问题**:双指针法一定能找到最优解吗?
|
||||
|
||||
**证明**:
|
||||
|
||||
假设当前指针在 `left` 和 `right`,且 `height[left] < height[right]`。
|
||||
|
||||
**当前容量**:`S = height[left] × (right - left)`
|
||||
|
||||
**如果移动 right 指针**:
|
||||
- 新容量:`S' = min(height[left], height[right-1]) × (right - 1 - left)`
|
||||
- 由于 `height[left] < height[right]`,且 `right-1 < right`
|
||||
- 所以 `S' <= height[left] × (right - 1 - left) < height[left] × (right - left) = S`
|
||||
|
||||
**结论**:移动较高的指针不会得到更大的容量。
|
||||
|
||||
**因此**:每次移动较短的指针,可以保证不遗漏最优解。
|
||||
|
||||
## 解题思路
|
||||
|
||||
### 方法一:双指针法(最优解)
|
||||
|
||||
Reference in New Issue
Block a user