621. 任务调度器
假设有任务["A","A","A","B","B","B"],n=2,可以画图表示CPU的时间分配
-
MT表示maxTime,这个任务列表中出现次数最大的任务数量,这里就是MT=3
-
MC表示maxCount,在这个任务列表中与出现最多的任务次数相同的任务数目,包括这个出现次数最多的任务,比如这里的就是AB,MC=2
-
要计算执行时间就是计算有内容格子的数目,计算公式为
minWorkTime = (maxTime-1) * (n + 1) + maxCount
-
考虑如下情况公式失效:得出结果偏小,我们更新计算公式为
Math.max(minWorkTime, tasks.length)
-
但是假如任务很多的时候,可能不需要考虑休息时间,公式偏小失效,格子数为数组长度
-
假如出现次数最多的任务只有1个,可能不需要考虑休息时间,公式偏小失效,格子数为数组长度
-
加入休息时间为0,直接按顺序依次执行即可,公式偏小失效,最终格子数就为数组长度
-
public int leastInterval(char[] tasks, int n) {
public int leastInterval(char[] tasks, int n) {
int[] bucket = new int[26]; //任务的执行,任务为26个字母
for(int i = 0; i < tasks.length; i++){
bucket[tasks[i] - 'A']++; //跟A做减法,找到所有字母任务执行的次数
}
Arrays.sort(bucket); //从小到大排序bucket,大的在最后一位
int maxTime = bucket[25]; //需要执行次数最多的任务
int maxCount = 1; //初始化和执行次数最多的任务执行次数一样的任务个数
for(int j = 24; j >= 0; j--){ //从倒数第二个开始,倒序查看有无跟最多执行次数一样的
if(bucket[j] == maxTime ){
maxCount++; //有就++
}else {
//如果不和maxTime一样,直接跳出循环,提高效率
break;
}
}
int minWorkTime = (maxTime - 1) * (n + 1) + maxCount; //根据公式计算最小工作时长
return Math.max(minWorkTime, tasks.length); //判断公式是否偏小失效
}
}
标签:621,tasks,int,bucket,次数,任务,maxTime,任务调度,leetcode From: https://www.cnblogs.com/phonk/p/16771370.html