
【贪心】装满杯子需要的最短总时长
题目
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。
给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
示例 1:
| |
示例 2:
| |
示例 3:
| |
提示:
amount.length == 30 <= 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.length1 <= n <= 10^5start和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^41 <= 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种小球,由乘法原理求最终结果
代码
| |
