题目:
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时间。
返回完成所有任务所需要的 最短时间间隔 。

解法一(模拟):
一种容易想到的方法是,按照时间顺序,依次给每一个时间单元分配任务。如果当前有多种任务不在冷却中,我们应当选择剩余执行次数最多的那个任务,将每种任务的剩余执行次数尽可能平均,使得CPU处于待命状态的时间尽可能少。我们可以用一个二元组kyk(rest, nextValid)记录每个任务的状态,其中rest表示每个任务剩余的执行次数,nextValid表示每个因冷却限制最早可以执行的时间。我们用index记录当前的时间,根据我们的策略,我们需要选择不在冷却中并且剩余执行次数最多的那个任务。
我们需要找到满足nextValid≤time的并且rest最大的索引i,然后更新此任务下的(rest, nextValid)状态,记录任务i下一次冷却结束的时间以及剩余执行次数,如果更新后的rest==0,那么任务i全部做完,我们在遍历二元数组时可以忽略它了。而对于time的更新,我们可以选择将其不断增加1,模拟一个时间片。但这样会导致我们在CPU处于待命状态时,对二元数组进行不必要的遍历,为了减少时间复杂度,我们可以在每次遍历之前,将time更新为所有nextValid中的最小值,

最低0.47元/天 解锁文章
2834

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



