621 任务调度器【python3】

题目

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。
然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的 最短时间 。

代码

模拟 6584ms

首先处理n=0的特殊情况,由于没有冷却时间,任何执行顺序,时间都等于任务总数量。
打算模拟执行任务的场合:两个字典D和D_tmp记录每种任务的数量,以及每种任务上一次在第几个单位时间执行的。其中-1代表该任务还从未执行过,非负整数代表执行在第几个单位时间。
由于有冷却时间,每次执行任务,应当优先执行当前数量最多的可执行任务:即该类任务未执行的数量还有剩余,并且从未执行过,或者已经过了冷却时间。
执行后应当更新字典D和D_tmp.
如果当前没有可执行的任务,则应当待命
当任务全部执行完毕,则结束递归。

耗时太长了。。暂时没想到优化

class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        # 无冷却时间,最短时间等于任务数量
        if n==0:
            return len(tasks)

        D={} # 记录每种任务的数量
        for x in tasks:
            if x not in D:
                D[x]=1
            else:
                D[x]+=1
        # 记录每种任务上一次执行的时间,-1代表还未执行过,非负数代表执行在第几个单位时间
        # 例如A-B-(待命) A在第0个单位时间执行,B在第1个单位时间执行
        D_pre={x:-1 for x in D} 

        # 每次执行任务,优先执行当前数量最多的可执行任务,如果没有一个任务能够执行,则待命
        # 每当要执行一个任务,反向查找上一个已经执行的同类任务是否满足冷却时间
        task_order=[] # 记录任务调度顺序
        def DFS():
            # 当前是第几个单位时间
            cur_time=len(task_order)
            # 按任务数量降序排列
            D_tmp=sorted(D.items(),key=lambda x:x[1],reverse=True)

            # 任务全部执行完毕,结束递归
            if D_tmp[0][1]==0:
                return 'finish'
            
            for task in D_tmp:
                # 执行从未执行或者过了冷却时间的数量最大的任务
                if D[task[0]]>0 and (D_pre[task[0]]==-1 or cur_time-D_pre[task[0]]>=n+1):
                    task_order.append(task[0])
                    D_pre[task[0]]=cur_time
                    D[task[0]]-=1
                    DFS()
                    return 'finish'
                
            task_order.append('待命')
            DFS()

        DFS()
        #print(task_order)
        return len(task_order)

                
            



















        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值