【贪心】装满杯子需要的最短总时长
题目
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2
杯 不同 类型的水或者 1
杯任意类型的水。
给你一个下标从 0 开始、长度为 3
的整数数组 amount
,其中 amount[0]
、amount[1]
和 amount[2]
分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
示例 1:
|
|
示例 2:
|
|
示例 3:
|
|
提示:
amount.length == 3
0 <= amount[i] <= 100
解题思路
赛时看数据规模直接模拟了,每次装待装容量最多的两种水即可。
代码
|
|
偷学代码
肯定是最好每次都选两个。 分两种情况,一种是有一种水特别多,那么答案就是这种水的数量。
否则,一定可以匹配到只剩一杯,或匹配完。
|
|
【模拟】无限集中的最小数字
题目
现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...]
。
实现 SmallestInfiniteSet
类:
SmallestInfiniteSet()
初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest()
移除 并返回该无限集中的最小整数。void addBack(int num)
如果正整数num
不 存在于无限集中,则将一个num
添加 到该无限集中。
示例:
|
|
提示:
1 <= num <= 1000
- 最多调用
popSmallest
和addBack
方法 共计1000
次
解题思路
模拟。大水题
代码
|
|
【思维】移动片段得到字符串
题目
给你两个字符串 start
和 target
,长度均为 n
。每个字符串 仅 由字符 'L'
、'R'
和 '_'
组成,其中:
- 字符
'L'
和'R'
表示片段,其中片段'L'
只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段'R'
只有在其右侧直接存在一个 空位 时才能向 右 移动。 - 字符
'_'
表示可以被 任意'L'
或'R'
片段占据的空位。
如果在移动字符串 start
中的片段任意次之后可以得到字符串 target
,返回 true
;否则,返回 false
。
示例 1:
|
|
示例 2:
|
|
示例 3:
|
|
提示:
n == start.length == target.length
1 <= n <= 10^5
start
和target
由字符'L'
、'R'
和'_'
组成
解题思路
首先L和R的个数要分别相等
由于L和R不能互相穿过,所以相对位置要相等
L只能往左移,R只能往右移
相对位置相等时,start的L
绝对位置一定不能小于target的L
绝对位置,start的R
绝对位置一定不能大于target的R
绝对位置
代码
|
|
【组合数学】统计理想数组的数目
题目
给你两个整数 n
和 maxValue
,用于描述一个 理想数组 。
对于下标从 0 开始、长度为 n
的整数数组 arr
,如果满足以下条件,则认为该数组是一个 理想数组 :
- 每个
arr[i]
都是从1
到maxValue
范围内的一个值,其中0 <= i < n
。 - 每个
arr[i]
都可以被arr[i - 1]
整除,其中0 < i < n
。
返回长度为 n
的 不同 理想数组的数目。由于答案可能很大,返回对 10^9 + 7
取余的结果。
示例 1:
|
|
示例 2:
|
|
提示:
2 <= n <= 10^4
1 <= maxValue <= 10^4
解题思路
考虑以x结尾的理想数组,x可以进行质因数分解 $x = q_1^{r_1}q_2^{r_2} \cdots q_m^{r_m}$
构造出一个理想数组等价为,先确定结尾x,再每次将$r_i$个$q_i$因子可重复地放入n个’盒子’中(长为n的数组的n个位置上)
可重复组合$H_n^r = C_{n+r-1}^r$,可利用隔板法思考,即r个球和n-1个隔板进行组合,共C(r+n-1, r)种方案
总共有m种小球,由乘法原理求最终结果
代码
|
|