1
- [ 本题视频讲解 ] ( https://www.bilibili.com/video/BV1og4y1Z7SZ/ )
1
+ ## 观察
2
2
3
3
为方便描述,把 $0$ 也算作可以得到的数。
4
4
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] $ 中的所有整数 。
6
6
7
- 分类讨论:
7
+ ## 思路
8
8
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] $。分类讨论,看是否要添加数字:
11
10
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/ )
13
17
14
18
``` py [sol-Python3]
15
19
class Solution :
@@ -33,8 +37,7 @@ class Solution {
33
37
int ans = 0 , s = 1 , i = 0 ;
34
38
while (s <= target) {
35
39
if (i < coins. length && coins[i] <= s) {
36
- s += coins[i];
37
- i++ ;
40
+ s += coins[i++ ];
38
41
} else {
39
42
s *= 2 ; // 必须添加 s
40
43
ans++ ;
@@ -49,12 +52,11 @@ class Solution {
49
52
class Solution {
50
53
public:
51
54
int minimumAddedCoins(vector<int > &coins, int target) {
52
- sort(coins.begin(), coins.end() );
55
+ ranges:: sort(coins);
53
56
int ans = 0, s = 1, i = 0;
54
57
while (s <= target) {
55
58
if (i < coins.size() && coins[ i] <= s) {
56
- s += coins[ i] ;
57
- i++;
59
+ s += coins[ i++] ;
58
60
} else {
59
61
s * = 2; // 必须添加 s
60
62
ans++;
@@ -82,7 +84,65 @@ func minimumAddedCoins(coins []int, target int) (ans int) {
82
84
}
83
85
```
84
86
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
+
85
124
#### 复杂度分析
86
125
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})$ 次。瓶颈主要在排序上。
88
127
- 空间复杂度:$\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