题目链接
任务调度器
题目描述
注意点
- tasks[i] 是大写英文字母
- 任务可以以任意顺序执行
- 两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间
解答思路
- 利用桶思想,将不同的字母放进同一个桶中,桶的数量为tasks中字母出现频率最高的次数,每个桶的容量大小为n,如下图所示
- 关键是要找到两个数字:一是字母出现频率最高的次数maxTimes,二是除去前面(n + 1)个字母或null组成的桶外最后一个桶需要安排的剩余字母exceNums,最终可以计算出完成所有任务所需要的最短时间为(maxTimes - 1) * (n + 1) + exceNums
- 要注意一种特殊情况,如果有多个频率maxTimes的字母,其数量大于n,则每个桶会装不同的字母会有多个方案,但是在该情况下一定有方案保证任意两个任务之间的相隔时间大于等于n,此时无需考虑待命状态,任务的数量就算完成所有任务所需要的最短时间
代码
class Solution {
public int leastInterval(char[] tasks, int n) {
// 字母出现频率最高的次数
int maxTimes = 0;
int[] arr = new int[26];
for (char c : tasks) {
arr[c - 'A'] += 1;
maxTimes = Math.max(maxTimes, arr[c - 'A']);
}
// 除去前面(n + 1)个字母或null组成的桶外最后一个桶需要安排的剩余字母
int exceNums = 0;
for (int i = 0; i < 26; i++) {
// arr[i]必定小于等于maxTimes,小于时说明前面的桶已经能将该字母安排完,等于时最后一个桶也需要安排该字母
if (arr[i] == maxTimes) {
exceNums++;
}
}
return Math.max((maxTimes - 1) * (n + 1) + exceNums, tasks.length);
}
}
关键点
- 理解桶思想
- 怎么找到maxTimes和exceNums两个关键数字
- 注意如果有多个频率maxTimes的字母的特殊情况