题目
给你一个用字符数组 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)