欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

621. 任务调度器

程序员文章站 2022-07-12 12:38:35
...

题目描述:给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
解题思路:找到出现次数最多的任务,假设为A,首先安排A, 然后在执行A的冷却时间执行剩余的其他任务,每一轮间隔的安插其他任务,保证冷却时间如果还有剩余的冷却时间,那么总的时间就为总的任务数+剩余冷却时间,如果没有剩余的冷却时间,却还有任务没有安排,可以假设在添加一列虚拟的剩余时间,将剩余的任务用同样的方案安排在虚拟的剩余时间,这样在虚拟时间中的任务是保证了冷却时间的,原有的任务执行的间隔时间只会增加不会减少,也保证了冷却时间,代码如下:

class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        import collections
        counter = collections.Counter(tasks)
        key2count = counter.most_common()
        max_val = key2count[0][1] - 1
        slot = max_val * n
        for key, count in key2count[1:]:
            slot -= min(count, max_val)
        return slot+len(tasks) if slot > 0 else len(tasks)