621. 任务调度器
问题描述
给你一个用字符数组表示的 CPU 需要执行的任务列表,其中 tasks[i] 表示第 i 个任务。任务用大写字母 A-Z 表示。
CPU 每个周期只能执行一个任务,且任务之间有冷却时间 n:两个相同任务之间必须有至少 n 个周期的冷却时间(可以执行其他任务或空闲)。
返回完成所有任务所需的最短时间。
示例:
输入: tasks = ["A","A","A","B","B","B"], n = 2
输出: 8
解释: A -> B -> idle -> A -> B -> idle -> A -> B
算法思路
核心思想:数学计算 + 桶思想
- 关键:限制执行速度的是出现次数最多的任务
- 桶模型:将执行周期分为
(maxFreq - 1)个完整桶,每个桶大小为(n + 1) - 最后桶:放入剩余任务,不需要冷却时间
计算公式:
总时间 = max(
(maxFreq - 1) * (n + 1) + countMax, // 桶模型计算
totalTasks // 至少需要的总时间
)
关键:
maxFreq:出现次数最多的任务的频率countMax:有多少个任务的出现次数等于maxFreqn + 1:一个完整周期(包括冷却时间)
代码实现
import java.util.*;
class Solution {
/**
* 计算完成所有任务所需的最短时间
*
* @param tasks 任务数组,每个元素是大写字母A-Z
* @param n 冷却时间,相同任务间至少间隔n个周期
* @return 完成所有任务的最短时间
*/
public int leastInterval(char[] tasks, int n) {
// 边界情况:没有任务或冷却时间为0
if (tasks == null || tasks.length == 0) {
return 0;
}
if (n == 0) {
return tasks.length;
}
// 第一步:统计每个任务的出现频率
Map<Character, Integer> freqMap = new HashMap<>();
for (char task : tasks) {
freqMap.put(task

最低0.47元/天 解锁文章
51万+

被折叠的 条评论
为什么被折叠?



