这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战 | 创作学习持续成长,夺宝闯关赢大奖 - 掘金 (juejin.cn)
题目链接
题解及分析
任务调度器
给你一个用字符数组tasks表示的CPU需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在1个单位时间内执行完。在任何一个单位时间,CPU可以完成一个任务,或者处于待命状态。
然而,两个相同种类的任务之间必须有长度为整数n的冷却时间,因此至少有连续n个单位时间内CPU在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
leetcode的模拟解法没看明白,只记录构造解法
原理图挂上:
- 把出现次数最多的元素次数作为行数,将每种元素推入
- 原因:出现次数越多,那么需要在其相邻分配的不同任务越多,最后执行以行的顺序执行时,最多的元素最先开始执行
- 将任务放入不同列,原则是同行不同列尽量不同
- 将如果需要执行maxExec次的任务的数量为maxCount,那么类似地可以得到对应的总时间为:(maxExec−1)(n+1)+maxCount
- 转自leetcode评论:这个公式如何算出来的?
- 假设数组 ["A","A","A","B","B","C"],n = 2,A的频率最高,记为count = 3,所以两个A之间必须间隔2个任务,才能满足题意并且是最短时间(两个A的间隔大于2的总时间必然不是最短),因此执行顺序为: A->X->X->A->X->X->A,这里的X表示除了A以外其他字母,或者是待命,不用关心具体是什么,反正用来填充两个A的间隔的。上面执行顺序的规律是: 有count - 1个A,其中每个A需要搭配n个X,再加上最后一个A,所以总时间为 (count - 1) * (n + 1) + 1
- 要注意可能会出现多个频率相同且都是最高的任务,比如 ["A","A","A","B","B","B","C","C"],所以最后会剩下一个A和一个B,因此最后要加上频率最高的不同任务的个数 maxCount
- 公式算出的值可能会比数组的长度小,如["A","A","B","B"],n = 0,此时要取数组的长度
- 转自leetcode评论:这个公式如何算出来的?
var leastInterval = function(tasks, n) {
const freq = _.countBy(tasks);
const maxExec = Math.max(...Object.values(freq))
let maxCount = 0
Object.values(freq).forEach(i => {
if(i === maxExec) {
maxCount++
}
})
return Math.max((maxExec - 1)*(n + 1) + maxCount, tasks.length)
};