Leetcode Link: 621. 任务调度器 - 力扣(LeetCode)

题目

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的 最短时间 。

解法一:自己的思路

思路: 非常 navie 的思路,勉强过关

有两个关键点:

  1. 我们要用完一个之后,要计时,保证在规定的间隔内不会用这个
  2. 每次先处理剩的最多的

关于 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

解法二

思路: 更多更好的思路,一定要看题解,我第一次做的时候懒得看了~

题解

解法三

思路

题解

启发和联系