Leetcode-Medium 621. Task Scheduler

weixin_33766168發表於2019-03-05

題目描述

給定一個char陣列表示CPU需要執行的任務。它包含大寫字母A到Z,其中不同的字母代表不同的任務。每項任務都可以在一個時間間隔內完成。對於每個間隔,CPU可以完成一個任務或空閒。但是有規定一個非負整數n代表兩個相同任務之間需要至少n個時間單位。球最少數量的時間單位完成所有任務。

需要返回CPU將完成所有給定任務所需的最少間隔數。

例項:

Input: tasks = ["A","A","A","B","B","B"], n = 2
Output: 8
Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.

思路

dicussion 分享的思路concise Java Solution O(N) time O(26) space,通過分析人物佇列的規律來計算:

首先考慮出現次數最多的字元,我們可以先確定它們的相對位置,然後將它們用作框架來插入剩餘的不常用的字元


1531909-77fed48bbda15b15.png

通過上面的分析,我們可以發現最少任務時間為:(最多工數-1)*(n + 1) + (相同最多工的任務個數)。

假設AAAABBBBCCDE,n=3,那麼時間為:(NUM(A)-1)*(3+1)+2=14

程式碼實現

class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        c=collections.Counter(tasks)
        mc,tie_ct=c.most_common(1)[0][1],0
        for k,v in c.most_common()[1:]:
            if v==mc:
                tie_ct+=1
            else:
                break
        return max(len(tasks),(mc-1)*n+mc+tie_ct)

參考資料

相關文章