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

解法一:自己的思路
思路: 非常 navie 的思路,勉强过关
有两个关键点:
- 我们要用完一个之后,要计时,保证在规定的间隔内不会用这个
- 每次先处理剩的最多的
关于 1:显然,这个用一个长度为 n (间隔时间) 的队列就行,只不过必须要保证每次都要 append 和 pop。如果没有可以 append 的元素,就 append (None) 关于2:可以用单调队列,但是SortedList不能输入相等的元素,所以我也不知道怎么弄,就每次都重新自己排序…
题解:
class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
d = Counter(tasks)
lst = []
for k, v in d.items():
lst.append([k,v])
q = deque([None]*n)
res = 0
path = []
while(sum([x[1] for x in lst]) != 0):
lst = sorted(lst, key=lambda x: -x[1])
res += 1
flag = 0
for i in range(len(lst)):
if lst[i][0] not in q and lst[i][1] > 0:
lst[i][1] -= 1
path.append(lst[i][0])
q.append(lst[i][0])
q.popleft()
flag = 1
break
if flag == 0: # 都不满足要求
path.append(None)
q.append(None)
q.popleft()
return res解法二
思路: 更多更好的思路,一定要看题解,我第一次做的时候懒得看了~
题解:
解法三
思路:
题解: