Skip to content

Commit c6ae51f

Browse files
committed
补充第 600 ~ 699 题的题目解析(增加 34 道题)
1 parent c330b5a commit c6ae51f

37 files changed

+3847
-1
lines changed

docs/00_preface/00_05_solutions_list.md

Lines changed: 35 additions & 1 deletion
Large diffs are not rendered by default.

docs/others/update_time.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## 2026-01
22

33
- 2026-01-01 补充第 500 ~ 599 题的题目解析(增加 34 道题)
4+
- 2026-01-02 补充第 600 ~ 699 题的题目解析(增加 34 道题)
45

56
## 2025-10
67

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# [0679. 24 点游戏](https://leetcode.cn/problems/24-game/)
2+
3+
- 标签:数组、数学、回溯
4+
- 难度:困难
5+
6+
## 题目链接
7+
8+
- [0679. 24 点游戏 - 力扣](https://leetcode.cn/problems/24-game/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
给定一个长度为4的整数数组 $cards$。你有 $4$ 张卡片,每张卡片上都包含一个范围在 $[1,9]$ 的数字。您应该使用运算符 `['+', '-', '*', '/']` 和括号 `'('``')'` 将这些卡片上的数字排列成数学表达式,以获得值 $24$。
15+
16+
你须遵守以下规则:
17+
18+
- 除法运算符 `/` 表示实数除法,而不是整数除法。
19+
- 例如, `"4 / (1 - 2 / 3)= 4 / (1 / 3) = 12"`
20+
- 每个运算都在两个数字之间。特别是,不能使用 `-` 作为一元运算符。
21+
- 例如,如果 $cards =[1,1,1,1]$,则表达式 `"-1 -1 -1 -1"` 是 不允许 的。
22+
- 你不能把数字串在一起
23+
- 例如,如果 $cards =[1,2,1,2]$,则表达式 `"12 + 12"` 无效。
24+
25+
**要求**
26+
27+
如果可以得到这样的表达式,其计算结果为 24,则返回 true ,否则返回 false。
28+
29+
**说明**
30+
31+
- $cards.length == 4$。
32+
- $1 \le cards[i] \le 9$。
33+
34+
**示例**
35+
36+
- 示例 1:
37+
38+
```python
39+
输入: cards = [4, 1, 8, 7]
40+
输出: true
41+
解释: (8-4) * (7-1) = 24
42+
```
43+
44+
- 示例 2:
45+
46+
```python
47+
输入: cards = [1, 2, 1, 2]
48+
输出: false
49+
```
50+
51+
## 解题思路
52+
53+
### 思路 1:回溯算法
54+
55+
#### 思路 1:算法描述
56+
57+
这道题目要求判断是否可以通过四则运算和括号将四个数字组合成 $24$。
58+
59+
我们可以使用回溯算法来枚举所有可能的运算顺序和运算符组合。每次从数组中选择两个数字进行运算,将运算结果放回数组,然后递归处理剩余的数字,直到数组中只剩下一个数字,判断是否等于 $24$。
60+
61+
具体步骤如下:
62+
63+
1. 如果数组中只剩下一个数字,判断是否等于 $24$(考虑浮点数误差,判断是否在 $24$ 的附近)。
64+
2. 枚举数组中的任意两个数字 $a$ 和 $b$,以及四种运算符 $+$、$-$、$\times$、$\div$。
65+
3. 计算 $a$ 和 $b$ 的运算结果,将结果放回数组,递归处理剩余的数字。
66+
4. 如果找到一种方案使得最终结果为 $24$,返回 $True$。
67+
5. 回溯,尝试其他的数字组合和运算符。
68+
69+
注意:除法运算需要判断除数是否为 $0$。
70+
71+
#### 思路 1:代码
72+
73+
```python
74+
class Solution:
75+
def judgePoint24(self, cards: List[int]) -> bool:
76+
TARGET = 24
77+
EPSILON = 1e-6 # 浮点数误差范围
78+
79+
def backtrack(nums):
80+
# 如果只剩下一个数字,判断是否等于 24
81+
if len(nums) == 1:
82+
return abs(nums[0] - TARGET) < EPSILON
83+
84+
# 枚举任意两个数字进行运算
85+
n = len(nums)
86+
for i in range(n):
87+
for j in range(n):
88+
if i == j:
89+
continue
90+
91+
a, b = nums[i], nums[j]
92+
# 剩余的数字
93+
remaining = [nums[k] for k in range(n) if k != i and k != j]
94+
95+
# 枚举四种运算符
96+
# 加法
97+
if backtrack(remaining + [a + b]):
98+
return True
99+
# 减法
100+
if backtrack(remaining + [a - b]):
101+
return True
102+
# 乘法
103+
if backtrack(remaining + [a * b]):
104+
return True
105+
# 除法(需要判断除数是否为 0)
106+
if abs(b) > EPSILON and backtrack(remaining + [a / b]):
107+
return True
108+
109+
return False
110+
111+
# 将整数转换为浮点数
112+
return backtrack([float(card) for card in cards])
113+
```
114+
115+
#### 思路 1:复杂度分析
116+
117+
- **时间复杂度**:$O(1)$。虽然看起来是指数级别的复杂度,但由于数组长度固定为 $4$,所以时间复杂度是常数级别的。
118+
- **空间复杂度**:$O(1)$。递归调用栈的深度最多为 $4$,空间复杂度是常数级别的。
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# [0623. 在二叉树中增加一行](https://leetcode.cn/problems/add-one-row-to-tree/)
2+
3+
- 标签:树、深度优先搜索、广度优先搜索、二叉树
4+
- 难度:中等
5+
6+
## 题目链接
7+
8+
- [0623. 在二叉树中增加一行 - 力扣](https://leetcode.cn/problems/add-one-row-to-tree/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
给定一个二叉树的根 $root$ 和两个整数 $val$ 和 $depth$。
15+
16+
**要求**
17+
18+
在给定的深度 $depth$ 处添加一个值为 $val$ 的节点行。
19+
20+
注意,根节点 $root$ 位于深度 1。
21+
22+
**说明**
23+
24+
- 加法规则如下:
25+
- 给定整数 $depth$,对于深度为 $depth - 1$ 的每个非空树节点 $cur$ ,创建两个值为 $val$ 的树节点作为 $cur$ 的左子树根和右子树根。
26+
- $cur$ 原来的左子树应该是新的左子树根的左子树。
27+
- $cur$ 原来的右子树应该是新的右子树根的右子树。
28+
- 如果 $depth == 1$ 意味着 $depth - 1$ 根本没有深度,那么创建一个树节点,值 $val$ 作为整个原始树的新根,而原始树就是新根的左子树。
29+
- 节点数在 $[1, 10^{4}]$ 范围内。
30+
- 树的深度在 $[1, 10^{4}]$ 范围内。
31+
- $-10^{3} \le Node.val \le 10^{3}$。
32+
- $-10^{5} \le val \le 10^{5}$。
33+
- $1 \le depth \le the depth of tree + 1$。
34+
35+
**示例**
36+
37+
- 示例 1:
38+
39+
![](https://assets.leetcode.com/uploads/2021/03/15/addrow-tree.jpg)
40+
41+
```python
42+
输入: root = [4,2,6,3,1,5], val = 1, depth = 2
43+
输出: [4,1,1,2,null,null,6,3,1,5]
44+
```
45+
46+
- 示例 2:
47+
48+
![](https://assets.leetcode.com/uploads/2021/03/11/add2-tree.jpg)
49+
50+
```python
51+
输入: root = [4,2,null,3,1], val = 1, depth = 3
52+
输出: [4,2,null,1,1,3,null,null,1]
53+
```
54+
55+
## 解题思路
56+
57+
### 思路 1:广度优先搜索
58+
59+
#### 思路 1:算法描述
60+
61+
这道题目要求在二叉树的指定深度 $depth$ 处添加一行值为 $val$ 的节点。
62+
63+
我们可以使用广度优先搜索(BFS)来找到深度为 $depth - 1$ 的所有节点,然后为这些节点添加新的左右子节点。
64+
65+
特殊情况:如果 $depth = 1$,则需要创建一个新的根节点,原来的树作为新根节点的左子树。
66+
67+
具体步骤如下:
68+
69+
1. 如果 $depth = 1$,创建一个新的根节点,值为 $val$,原来的根节点作为新根节点的左子节点,返回新根节点。
70+
2. 使用 BFS 遍历二叉树,找到深度为 $depth - 1$ 的所有节点。
71+
3. 对于深度为 $depth - 1$ 的每个节点 $node$:
72+
- 创建两个新节点 $left\_node$ 和 $right\_node$,值都为 $val$。
73+
- 将 $node$ 的原左子节点作为 $left\_node$ 的左子节点。
74+
- 将 $node$ 的原右子节点作为 $right\_node$ 的右子节点。
75+
- 将 $left\_node$ 和 $right\_node$ 分别设置为 $node$ 的左右子节点。
76+
4. 返回根节点。
77+
78+
#### 思路 1:代码
79+
80+
```python
81+
# Definition for a binary tree node.
82+
# class TreeNode:
83+
# def __init__(self, val=0, left=None, right=None):
84+
# self.val = val
85+
# self.left = left
86+
# self.right = right
87+
class Solution:
88+
def addOneRow(self, root: Optional[TreeNode], val: int, depth: int) -> Optional[TreeNode]:
89+
# 特殊情况:在根节点前添加一行
90+
if depth == 1:
91+
new_root = TreeNode(val)
92+
new_root.left = root
93+
return new_root
94+
95+
# 使用 BFS 找到深度为 depth - 1 的所有节点
96+
queue = [root]
97+
current_depth = 1
98+
99+
while queue and current_depth < depth - 1:
100+
size = len(queue)
101+
for _ in range(size):
102+
node = queue.pop(0)
103+
if node.left:
104+
queue.append(node.left)
105+
if node.right:
106+
queue.append(node.right)
107+
current_depth += 1
108+
109+
# 为深度为 depth - 1 的所有节点添加新的左右子节点
110+
for node in queue:
111+
# 创建新的左子节点
112+
left_node = TreeNode(val)
113+
left_node.left = node.left
114+
node.left = left_node
115+
116+
# 创建新的右子节点
117+
right_node = TreeNode(val)
118+
right_node.right = node.right
119+
node.right = right_node
120+
121+
return root
122+
```
123+
124+
#### 思路 1:复杂度分析
125+
126+
- **时间复杂度**:$O(n)$,其中 $n$ 是二叉树的节点数。最坏情况下需要遍历所有节点。
127+
- **空间复杂度**:$O(n)$。队列中最多存储 $n$ 个节点。
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# [0637. 二叉树的层平均值](https://leetcode.cn/problems/average-of-levels-in-binary-tree/)
2+
3+
- 标签:树、深度优先搜索、广度优先搜索、二叉树
4+
- 难度:简单
5+
6+
## 题目链接
7+
8+
- [0637. 二叉树的层平均值 - 力扣](https://leetcode.cn/problems/average-of-levels-in-binary-tree/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
给定一个非空二叉树的根节点 $root$。
15+
16+
**要求**
17+
18+
以数组的形式返回每一层节点的平均值。与实际答案相差 $10^{-5}$ 以内的答案可以被接受。
19+
20+
**说明**
21+
22+
- 树中节点数量在 $[1, 10^{4}]$ 范围内。
23+
- $-2^{31} \le Node.val \le 2^{31} - 1$。
24+
25+
**示例**
26+
27+
- 示例 1:
28+
29+
![](https://assets.leetcode.com/uploads/2021/03/09/avg1-tree.jpg)
30+
31+
```python
32+
输入:root = [3,9,20,null,null,15,7]
33+
输出:[3.00000,14.50000,11.00000]
34+
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11
35+
因此返回 [3, 14.5, 11] 。
36+
```
37+
38+
- 示例 2:
39+
40+
![](https://assets.leetcode.com/uploads/2021/03/09/avg2-tree.jpg)
41+
42+
```python
43+
输入:root = [3,9,20,15,7]
44+
输出:[3.00000,14.50000,11.00000]
45+
```
46+
47+
## 解题思路
48+
49+
### 思路 1:广度优先搜索
50+
51+
#### 思路 1:算法描述
52+
53+
这道题目要求返回二叉树每一层节点的平均值。我们可以使用广度优先搜索(BFS)来层序遍历二叉树。
54+
55+
具体步骤如下:
56+
57+
1. 初始化结果数组 $ans$ 和队列 $queue$,将根节点加入队列。
58+
2. 当队列不为空时,执行以下操作:
59+
- 记录当前层的节点数量 $size$。
60+
- 初始化当前层的节点值之和 $level\_sum = 0$。
61+
- 遍历当前层的所有节点:
62+
- 从队列中取出节点,将其值加到 $level\_sum$ 中。
63+
- 如果节点有左子节点,将左子节点加入队列。
64+
- 如果节点有右子节点,将右子节点加入队列。
65+
- 计算当前层的平均值 $level\_sum / size$,加入结果数组 $ans$。
66+
3. 返回结果数组 $ans$。
67+
68+
#### 思路 1:代码
69+
70+
```python
71+
# Definition for a binary tree node.
72+
# class TreeNode:
73+
# def __init__(self, val=0, left=None, right=None):
74+
# self.val = val
75+
# self.left = left
76+
# self.right = right
77+
class Solution:
78+
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
79+
if not root:
80+
return []
81+
82+
ans = []
83+
queue = [root]
84+
85+
while queue:
86+
size = len(queue) # 当前层的节点数量
87+
level_sum = 0 # 当前层的节点值之和
88+
89+
# 遍历当前层的所有节点
90+
for _ in range(size):
91+
node = queue.pop(0)
92+
level_sum += node.val
93+
94+
# 将下一层的节点加入队列
95+
if node.left:
96+
queue.append(node.left)
97+
if node.right:
98+
queue.append(node.right)
99+
100+
# 计算当前层的平均值
101+
ans.append(level_sum / size)
102+
103+
return ans
104+
```
105+
106+
#### 思路 1:复杂度分析
107+
108+
- **时间复杂度**:$O(n)$,其中 $n$ 是二叉树的节点数。需要遍历所有节点。
109+
- **空间复杂度**:$O(n)$。队列中最多存储 $n$ 个节点。

0 commit comments

Comments
 (0)