LeetCode 621 任務排程器

楓流仁武發表於2020-12-05

給你一個用字元陣列 tasks 表示的 CPU 需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。在任何一個單位時間,CPU 可以完成一個任務,或者處於待命狀態。

然而,兩個 相同種類 的任務之間必須有長度為整數 n 的冷卻時間,因此至少有連續 n 個單位時間內 CPU 在執行不同的任務,或者在待命狀態。

你需要計算完成所有任務所需要的 最短時間 。

輸入:tasks = ["A","A","A","B","B","B"], n = 2
輸出:8
解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
     在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行一個任務只需要一個單位時間,所以中間出現了(待命)狀態。

from typing import *
from collections import defaultdict, Counter
import heapq


class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        last_idx = {}
        que = []
        cnts = Counter(tasks)
        for c in cnts:
            heapq.heappush(que, (-cnts[c], c))
        idx = 0
        while que or last_idx:
            last = idx - n - 1
            if last in last_idx:
                heapq.heappush(que, last_idx[last])
                del last_idx[last]
            if not que:
                idx += 1
            else:
                t = heapq.heappop(que)
                if t[0] + 1 < 0:
                    last_idx[idx] = (t[0] + 1, t[1])
                idx += 1
        return idx

 

相關文章