Skip to content

Commit f598449

Browse files
committed
重写题解
1 parent 77bf5db commit f598449

File tree

1 file changed

+72
-12
lines changed

1 file changed

+72
-12
lines changed

leetcode/weekly/374/b/README.md

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1-
[本题视频讲解](https://www.bilibili.com/video/BV1og4y1Z7SZ/)
1+
## 观察
22

33
为方便描述,把 $0$ 也算作可以得到的数。
44

5-
假设现在得到了 $[0,s-1]$ 内的所有整数,如果此时新发现了一个整数 $x$,那么把 $x$ 加到已得到的数字中,就得到了 $[x,s+x-1]$ 内的所有整数
5+
假设现在得到了区间 $[0,s-1]$ 中的所有整数,如果此时遍历到整数 $x=\textit{coins}[i]$,那么把 $[0,s-1]$ 中的每个整数都增加 $x$,我们就得到了区间 $[x,s+x-1]$ 中的所有整数
66

7-
分类讨论:
7+
## 思路
88

9-
- 如果 $x \le s$,那么合并这两个区间,我们可以得到 $[0,s+x-1]$ 内的所有整数。
10-
- 如果 $x > s$,这意味着我们无法得到 $s$,那么就一定要把 $s$ 加到数组中(加一个比 $s$ 还小的数字就没法得到更大的数,不够贪),这样就可以得到 $[s,2s-1]$ 内的所有整数,再与 $[0,s-1]$ 合并,可以得到 $[0,2s-1]$ 内的所有整数。然后再重新考虑 $x$ 和 $s$ 的大小关系,继续分类讨论。
9+
把 $\textit{coins}$ 从小到大排序,遍历 $x=\textit{coins}[i]$。分类讨论,看是否要添加数字:
1110

12-
把 $\textit{coins}$ 排序,从小到大考虑 $x=\textit{coins}[i]$。按照上述分类讨论来看是否要添加数字。
11+
- 如果 $x \le s$,那么合并 $[0,s-1]$ 和 $[x,s+x-1]$ 这两个区间,我们可以得到 $[0,s+x-1]$ 中的所有整数。
12+
- 如果 $x > s$,或者遍历完了 $\textit{coins}$ 数组,这意味着我们无法得到 $s$,那么就一定要把 $s$ 加到数组中(加一个比 $s$ 还小的数字就没法得到更大的数,不够贪),这样就可以得到了 $[s,2s-1]$ 中的所有整数,再与 $[0,s-1]$ 合并,可以得到 $[0,2s-1]$ 中的所有整数。然后再重新考虑 $x$ 和 $s$ 的大小关系,继续分类讨论。
13+
14+
当 $s > \textit{target}$ 时,我们就得到了 $[1,target]$ 中的所有整数,退出循环。
15+
16+
附:[视频讲解](https://www.bilibili.com/video/BV1og4y1Z7SZ/)
1317

1418
```py [sol-Python3]
1519
class Solution:
@@ -33,8 +37,7 @@ class Solution {
3337
int ans = 0, s = 1, i = 0;
3438
while (s <= target) {
3539
if (i < coins.length && coins[i] <= s) {
36-
s += coins[i];
37-
i++;
40+
s += coins[i++];
3841
} else {
3942
s *= 2; // 必须添加 s
4043
ans++;
@@ -49,12 +52,11 @@ class Solution {
4952
class Solution {
5053
public:
5154
int minimumAddedCoins(vector<int> &coins, int target) {
52-
sort(coins.begin(), coins.end());
55+
ranges::sort(coins);
5356
int ans = 0, s = 1, i = 0;
5457
while (s <= target) {
5558
if (i < coins.size() && coins[i] <= s) {
56-
s += coins[i];
57-
i++;
59+
s += coins[i++];
5860
} else {
5961
s *= 2; // 必须添加 s
6062
ans++;
@@ -82,7 +84,65 @@ func minimumAddedCoins(coins []int, target int) (ans int) {
8284
}
8385
```
8486

87+
```js [sol-JavaScript]
88+
var minimumAddedCoins = function(coins, target) {
89+
coins.sort((a, b) => a - b);
90+
let ans = 0, s = 1, i = 0;
91+
while (s <= target) {
92+
if (i < coins.length && coins[i] <= s) {
93+
s += coins[i++];
94+
} else {
95+
s *= 2; // 必须添加 s
96+
ans++;
97+
}
98+
}
99+
return ans;
100+
};
101+
```
102+
103+
```rust [sol-Rust]
104+
impl Solution {
105+
pub fn minimum_added_coins(mut coins: Vec<i32>, target: i32) -> i32 {
106+
coins.sort_unstable();
107+
let mut ans = 0;
108+
let mut s = 1;
109+
let mut i = 0;
110+
while s <= target {
111+
if i < coins.len() && coins[i] <= s {
112+
s += coins[i];
113+
i += 1;
114+
} else {
115+
s *= 2; // 必须添加 s
116+
ans += 1;
117+
}
118+
}
119+
ans
120+
}
121+
}
122+
```
123+
85124
#### 复杂度分析
86125

87-
- 时间复杂度:$\mathcal{O}(n\log n + \log \textit{target})$,其中 $n$ 为 $\textit{coins}$ 的长度。$s$ 至多翻倍 $\mathcal{O}(\log \textit{target})$ 次。
126+
- 时间复杂度:$\mathcal{O}(n\log n + \log \textit{target})$,其中 $n$ 为 $\textit{coins}$ 的长度。$s$ 至多翻倍 $\mathcal{O}(\log \textit{target})$ 次。瓶颈主要在排序上。
88127
- 空间复杂度:$\mathcal{O}(1)$。忽略排序的栈开销。
128+
129+
## 相似题目
130+
131+
- [330. 按要求补齐数组](https://leetcode.cn/problems/patching-array/)
132+
- [1798. 你能构造出连续值的最大数目](https://leetcode.cn/problems/maximum-number-of-consecutive-values-you-can-make/)
133+
134+
## 分类题单
135+
136+
1. [滑动窗口(定长/不定长/多指针)](https://leetcode.cn/circle/discuss/0viNMK/)
137+
2. [二分算法(二分答案/最小化最大值/最大化最小值/第K小)](https://leetcode.cn/circle/discuss/SqopEo/)
138+
3. [单调栈(矩形系列/字典序最小/贡献法)](https://leetcode.cn/circle/discuss/9oZFK9/)
139+
4. [网格图(DFS/BFS/综合应用)](https://leetcode.cn/circle/discuss/YiXPXW/)
140+
5. [位运算(基础/性质/拆位/试填/恒等式/贪心/脑筋急转弯)](https://leetcode.cn/circle/discuss/dHn9Vk/)
141+
6. [图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)](https://leetcode.cn/circle/discuss/01LUak/)
142+
7. [动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)](https://leetcode.cn/circle/discuss/tXLS3i/)
143+
144+
更多题单,点我个人主页 - 讨论发布。
145+
146+
欢迎关注 [B站@灵茶山艾府](https://space.bilibili.com/206214)
147+
148+
[往期题解精选(已分类)](https://github.com/EndlessCheng/codeforces-go/blob/master/leetcode/SOLUTIONS.md)

0 commit comments

Comments
 (0)