leetcode-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); //判断公式是否偏小失效 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix