Skip to content

Commit 09519c9

Browse files
committed
补充第 900 ~ 999 题的题目解析(增加 69 道题)
1 parent 77a95b3 commit 09519c9

73 files changed

Lines changed: 7282 additions & 14 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/00_preface/00_05_solutions_list.md

Lines changed: 70 additions & 2 deletions
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,5 +1,6 @@
11
## 2026-01
22

3+
- 2026-01-09 补充第 900 ~ 999 题的题目解析(增加 69 道题)
34
- 2026-01-08 补充第 800 ~ 899 题的题目解析(增加 22 道题)
45
- 2026-01-07 补充第 800 ~ 899 题的题目解析(增加 37 道题)
56
- 2026-01-06 补充第 700 ~ 799 题的题目解析(增加 8 道题)

docs/solutions/0300-0399/linked-list-random-node.md

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515

1616
**要求**
1717

18-
实现 `Solution` 类:
18+
实现 Solution 类:
19+
1920
- `Solution(ListNode head)` 使用整数数组初始化对象。
2021
- `int getRandom()` 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。
2122

@@ -33,12 +34,9 @@
3334

3435
- 示例 1:
3536

36-
```python
37-
示例:
38-
3937
![](https://assets.leetcode.com/uploads/2021/03/16/getrand-linked-list.jpg)
4038

41-
39+
```python
4240
输入
4341
["Solution", "getRandom", "getRandom", "getRandom", "getRandom", "getRandom"]
4442
[[[1, 2, 3]], [], [], [], [], []]
@@ -55,13 +53,6 @@ solution.getRandom(); // 返回 3
5553
// getRandom() 方法应随机返回 123中的一个,每个元素被返回的概率相等。
5654
```
5755

58-
- 示例 2:
59-
60-
```python
61-
输入:
62-
输出:
63-
```
64-
6556
## 解题思路
6657

6758
### 思路 1:水塘抽样算法
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# [0923. 三数之和的多种可能](https://leetcode.cn/problems/3sum-with-multiplicity/)
2+
3+
- 标签:数组、哈希表、双指针、计数、排序
4+
- 难度:中等
5+
6+
## 题目链接
7+
8+
- [0923. 三数之和的多种可能 - 力扣](https://leetcode.cn/problems/3sum-with-multiplicity/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
给定一个整数数组 $arr$,以及一个整数 $target$ 作为目标值。
15+
16+
**要求**
17+
18+
返回满足 $i < j < k$ 且 $arr[i] + arr[j] + arr[k] == target$ 的元组 $i, j, k$ 的数量。
19+
20+
由于结果会非常大,请返回 $10^9 + 7$ 的模。
21+
22+
**说明**
23+
24+
- $3 \le arr.length \le 3000$。
25+
- $0 \le arr[i] \le 10^{3}$。
26+
- $0 \le target \le 300$。
27+
28+
**示例**
29+
30+
- 示例 1:
31+
32+
```python
33+
输入:arr = [1,1,2,2,3,3,4,4,5,5], target = 8
34+
输出:20
35+
解释:
36+
按值枚举(arr[i], arr[j], arr[k]):
37+
(1, 2, 5) 出现 8 次;
38+
(1, 3, 4) 出现 8 次;
39+
(2, 2, 4) 出现 2 次;
40+
(2, 3, 3) 出现 2 次。
41+
```
42+
43+
- 示例 2:
44+
45+
```python
46+
输入:arr = [1,1,2,2,2,2], target = 5
47+
输出:12
48+
解释:
49+
arr[i] = 1, arr[j] = arr[k] = 2 出现 12 次:
50+
我们从 [1,1] 中选择一个 1,有 2 种情况,
51+
从 [2,2,2,2] 中选出两个 2,有 6 种情况。
52+
```
53+
54+
## 解题思路
55+
56+
### 思路 1:哈希表 + 双指针
57+
58+
#### 思路
59+
60+
这道题要求统计满足 $i < j < k$ 且 $arr[i] + arr[j] + arr[k] = target$ 的三元组数量。
61+
62+
由于数组元素范围较小($0 \le arr[i] \le 100$),我们可以使用哈希表统计每个数字的出现次数,然后枚举所有可能的三元组:
63+
64+
1. **统计频次**:使用哈希表 $count$ 统计每个数字的出现次数。
65+
2. **枚举三元组**:枚举所有可能的 $(i, j, k)$ 组合,其中 $i \le j \le k$:
66+
- 如果 $i + j + k = target$,计算该组合的方案数。
67+
- 方案数的计算需要考虑三个数是否相同:
68+
- 如果三个数都相同:$C(count[i], 3) = \frac{count[i] \times (count[i] - 1) \times (count[i] - 2)}{6}$
69+
- 如果两个数相同:$C(count[i], 2) \times count[k] = \frac{count[i] \times (count[i] - 1)}{2} \times count[k]$
70+
- 如果三个数都不同:$count[i] \times count[j] \times count[k]$
71+
3. 返回总方案数对 $10^9 + 7$ 取模的结果。
72+
73+
#### 代码
74+
75+
```python
76+
class Solution:
77+
def threeSumMulti(self, arr: List[int], target: int) -> int:
78+
MOD = 10**9 + 7
79+
from collections import Counter
80+
81+
# 统计每个数字的出现次数
82+
count = Counter(arr)
83+
res = 0
84+
85+
# 枚举所有可能的三元组 (i, j, k),其中 i <= j <= k
86+
for i in range(101):
87+
for j in range(i, 101):
88+
k = target - i - j
89+
if k < 0 or k > 100:
90+
continue
91+
92+
if i == j == k:
93+
# 三个数都相同:C(count[i], 3)
94+
res += count[i] * (count[i] - 1) * (count[i] - 2) // 6
95+
elif i == j:
96+
# 前两个数相同:C(count[i], 2) * count[k]
97+
if k > j:
98+
res += count[i] * (count[i] - 1) // 2 * count[k]
99+
elif j == k:
100+
# 后两个数相同:count[i] * C(count[j], 2)
101+
if k > i:
102+
res += count[i] * count[j] * (count[j] - 1) // 2
103+
else:
104+
# 三个数都不同
105+
if k > j:
106+
res += count[i] * count[j] * count[k]
107+
108+
res %= MOD
109+
110+
return res
111+
```
112+
113+
#### 复杂度分析
114+
115+
- **时间复杂度**:$O(n + C^2)$,其中 $n$ 是数组长度,$C = 101$ 是数字的范围。统计频次需要 $O(n)$,枚举三元组需要 $O(C^2)$。
116+
- **空间复杂度**:$O(C)$,需要哈希表存储每个数字的频次。
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# [0989. 数组形式的整数加法](https://leetcode.cn/problems/add-to-array-form-of-integer/)
2+
3+
- 标签:数组、数学
4+
- 难度:简单
5+
6+
## 题目链接
7+
8+
- [0989. 数组形式的整数加法 - 力扣](https://leetcode.cn/problems/add-to-array-form-of-integer/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
整数的「数组形式」$num$ 是按照从左到右的顺序表示其数字的数组。
15+
16+
- 例如,对于 $num = 1321$ ,数组形式是 $[1,3,2,1]$。
17+
18+
给定 $num$,整数的「数组形式」,和整数 $k$。
19+
20+
**要求**
21+
22+
返回 整数 $num + k$ 的「数组形式」。
23+
24+
**说明**
25+
26+
- $1 \le num.length \le 10^{4}$。
27+
- $0 \le num[i] \le 9$。
28+
- $num$ 不包含任何前导零,除了零本身。
29+
- $1 \le k \le 10^{4}$。
30+
31+
**示例**
32+
33+
- 示例 1:
34+
35+
```python
36+
输入:num = [1,2,0,0], k = 34
37+
输出:[1,2,3,4]
38+
解释:1200 + 34 = 1234
39+
```
40+
41+
- 示例 2:
42+
43+
```python
44+
输入:num = [2,7,4], k = 181
45+
输出:[4,5,5]
46+
解释:274 + 181 = 455
47+
```
48+
49+
## 解题思路
50+
51+
### 思路 1:模拟加法
52+
53+
#### 思路
54+
55+
这道题要求将数组形式的整数与整数 $k$ 相加,返回数组形式的结果。我们可以模拟加法的过程:
56+
57+
1. 从数组 $num$ 的最后一位开始,与 $k$ 的个位相加。
58+
2. 计算当前位的和以及进位。
59+
3. 将当前位的结果插入到结果数组的开头。
60+
4. 更新 $k$ 为进位值($k$ 除以 $10$)。
61+
5. 继续处理下一位,直到数组遍历完且 $k$ 为 $0$。
62+
63+
#### 代码
64+
65+
```python
66+
class Solution:
67+
def addToArrayForm(self, num: List[int], k: int) -> List[int]:
68+
res = []
69+
n = len(num)
70+
i = n - 1 # 从数组最后一位开始
71+
72+
# 当数组还有位数或 k 不为 0 时继续
73+
while i >= 0 or k > 0:
74+
# 获取当前位的数字
75+
digit = num[i] if i >= 0 else 0
76+
# 计算当前位的和
77+
total = digit + k % 10
78+
# 将当前位结果插入到结果数组开头
79+
res.append(total % 10)
80+
# 计算进位
81+
k = k // 10 + total // 10
82+
i -= 1
83+
84+
# 结果是逆序的,需要反转
85+
return res[::-1]
86+
```
87+
88+
#### 复杂度分析
89+
90+
- **时间复杂度**:$O(\max(n, \log k))$,其中 $n$ 是数组 $num$ 的长度,$\log k$ 是整数 $k$ 的位数。需要遍历所有位数。
91+
- **空间复杂度**:$O(1)$,不考虑结果数组的空间,只使用了常数个额外变量。
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# [0954. 二倍数对数组](https://leetcode.cn/problems/array-of-doubled-pairs/)
2+
3+
- 标签:贪心、数组、哈希表、排序
4+
- 难度:中等
5+
6+
## 题目链接
7+
8+
- [0954. 二倍数对数组 - 力扣](https://leetcode.cn/problems/array-of-doubled-pairs/)
9+
10+
## 题目大意
11+
12+
**描述**
13+
14+
给定一个长度为偶数的整数数组 $arr$。
15+
16+
**要求**
17+
18+
只有对 $arr$ 进行重组后可以满足「对于每个 $0 \le i < len(arr) / 2$,都有 $arr[2 \times i + 1] = 2 \times arr[2 \times i]$」时,返回 true;否则,返回 false。
19+
20+
**说明**
21+
22+
- $0 \le arr.length \le 3 \times 10^{4}$。
23+
- $arr.length$ 是偶数。
24+
- $-10^{5} \le arr[i] \le 10^{5}$。
25+
26+
**示例**
27+
28+
- 示例 1:
29+
30+
```python
31+
输入:arr = [3,1,3,6]
32+
输出:false
33+
```
34+
35+
- 示例 2:
36+
37+
```python
38+
输入:arr = [2,1,2,6]
39+
输出:false
40+
```
41+
42+
## 解题思路
43+
44+
### 思路 1:贪心 + 哈希表
45+
46+
#### 思路
47+
48+
这道题要求判断数组能否重组为二倍数对的形式,即 $arr[2 \times i + 1] = 2 \times arr[2 \times i]$。
49+
50+
我们可以使用贪心策略:
51+
52+
1. **统计频次**:使用哈希表统计每个数字出现的次数。
53+
2. **排序**:按绝对值从小到大排序。这样可以保证先处理较小的数,避免遗漏。
54+
3. **贪心匹配**:对于每个数 $x$,如果它还有剩余次数,就尝试找它的二倍 $2x$:
55+
- 如果 $2x$ 的次数不足,返回 `False`
56+
- 否则,将 $x$ 和 $2x$ 的次数都减 $1$。
57+
4. 如果所有数都能成功匹配,返回 `True`
58+
59+
**注意**:需要按绝对值排序,因为负数的二倍关系是 $-4$ 和 $-2$,而不是 $-2$ 和 $-4$。
60+
61+
#### 代码
62+
63+
```python
64+
class Solution:
65+
def canReorderDoubled(self, arr: List[int]) -> bool:
66+
from collections import Counter
67+
68+
# 统计每个数字的出现次数
69+
count = Counter(arr)
70+
71+
# 按绝对值从小到大排序
72+
for x in sorted(count, key=abs):
73+
# 如果 x 还有剩余次数
74+
if count[x] > 0:
75+
# 检查 2x 的次数是否足够
76+
if count[2 * x] < count[x]:
77+
return False
78+
# 匹配 x 和 2x
79+
count[2 * x] -= count[x]
80+
81+
return True
82+
```
83+
84+
#### 复杂度分析
85+
86+
- **时间复杂度**:$O(n \log n)$,其中 $n$ 是数组长度。主要时间消耗在排序上。
87+
- **空间复杂度**:$O(n)$,需要哈希表存储每个数字的频次。

0 commit comments

Comments
 (0)