leetcode 621 任務排程器

2021-09-02 18:49:15 字數 2422 閱讀 6774

給定乙個用字元陣列表示的 cpu 需要執行的任務列表。其中包含使用大寫的 a - z 字母表示的26 種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。cpu 在任何乙個單位時間內都可以執行乙個任務,或者在待命狀態。

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

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

示例 1:

輸入: tasks = ["a","a","a","b","b","b"], n = 2

輸出: 8

執行順序: a -> b -> (待命) -> a -> b -> (待命) -> a -> b.

思路:

參考:

由於題目中規定了兩個相同任務之間至少隔n個時間點,那麼我們首先應該處理的出現次數最多的那個任務,先確定好這些高頻任務,然後再來安排那些低頻任務。如果任務f的出現頻率最高,為k次,那麼我們用n個空位將每兩個f分隔開,然後我們按順序加入其他低頻的任務,來看乙個例子:

aaaabbbeeffgg 3

我們發現任務a出現了4次,頻率最高,於是我們在每個a中間加入三個空位,如下:

a---a---a---a

ab--ab--ab--a   (加入b)

abe-abe-ab--a   (加入e)

abefabe-abf-a   (加入f,每次盡可能填滿或者是均勻填充)

abefabegabfga   (加入g)

再來看乙個例子:

accceee 2

我們發現任務c和e都出現了三次,那麼我們就將ce看作乙個整體,在中間加入乙個位置即可:

ce-ce-ce

ceace-ce   (加入a)

注意最後面那個idle不能省略,不然就不滿足相同兩個任務之間要隔2個時間點了。

這道題好在沒有讓我們輸出任務安排結果,而只是問所需的時間總長,那麼我們就想個方法來快速計算出所需時間總長即可。我們仔細觀察上面兩個例子可以發現,都分成了(mx - 1)塊,再加上最後面的字母,其中mx為最大出現次數。比如例子1中,a出現了4次,所以有a---模組出現了3次,再加上最後的a,每個模組的長度為4。例子2中,ce-出現了2次,再加上最後的ce,每個模組長度為3。我們可以發現,模組的次數為任務最大次數減1,模組的長度為n+1,最後加上的字母個數為出現次數最多的任務,可能有多個並列。這樣三個部分都搞清楚了,寫起來就不難了,我們統計每個大寫字母出現的次數,然後排序,這樣出現次數最多的字母就到了末尾,然後我們向前遍歷,找出出現次數一樣多的任務個數,就可以迅速求出總時間長了,下面這段**可能最不好理解的可能就是最後一句了,那麼我們特別來講解一下。先看括號中的第二部分,前面分析說了mx是出現的最大次數,mx-1是可以分為的塊數,n+1是每塊中的個數,而後面的 25-i 是還需要補全的個數,用之前的例子來說明:

aaaabbbeeffgg 3

a出現了4次,最多,mx=4,那麼可以分為mx-1=3塊,如下:

a---a---a---

每塊有n+1=4個,最後還要加上末尾的乙個a,也就是25-24=1個任務,最終結果為13:

abefabegabfga

再來看另乙個例子:

accceee 2

c和e都出現了3次,最多,mx=3,那麼可以分為mx-1=2塊,如下:

ce-ce-

每塊有n+1=3個,最後還要加上末尾的乙個ce,也就是25-23=2個任務,最終結果為8:

ceace-ce

好,那麼此時你可能會有疑問,為啥還要跟原任務個數len相比,取較大值呢?我們再來看乙個例子:

aaabbb 0

a和b都出現了3次,最多,mx=3,那麼可以分為mx-1=2塊,如下:

abab

每塊有n+1=1個?你會發現有問題,這裡明明每塊有兩個啊,為啥這裡算出來n+1=1呢,因為給的n=0,這有沒有矛盾呢,沒有!因為n表示相同的任務間需要間隔的個數,那麼既然這裡為0了,說明相同的任務可以放在一起,這裡就沒有任何限制了,我們只需要執行完所有的任務就可以了,所以我們最終的返回結果一定不能小於任務的總個數len的,這就是要對比取較大值的原因了。

參見**如下:

public int leastinterval(char tasks, int n) 

arrays.sort(cnt);

int i = 25, mx = cnt[25], len = tasks.length;

while(i >= 0 && cnt[i] == mx) i--;

return math.max(len, (mx - 1) * (n + 1) + 25 - i);

}

Leetcode 621任務排程

首先統計同型別的任務數,然後從大到小排序 因為數量多的任務才會因為重複,需要間隔期 排序不影響結果,無論是三個a和兩個b,還是兩個a和三個b結果是一樣的。想法是有多個桶 桶的個數取決於數量最多的任務數 桶的容量至少是n 1,桶內元素不重複,如果元素不能填滿,就需要填入冷卻時間。如果多餘元素數量大於等...

LeetCode 621 任務排程器

給定乙個用字元陣列表示的 cpu 需要執行的任務列表。其中包含使用大寫的 a z 字母表示的26 種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。cpu 在任何乙個單位時間內都可以執行乙個任務,或者在待命狀態。然而,兩個相同種類的任務之間必須有長度為n的冷卻時...

LEETCODE 621任務排程器

採用用的比較多的統計詞頻的做法。先對char陣列中的字頻進行統計,然後排序。比如aaabbcc這種串且n 2,可以使a a a 然後把bc分別插進去。網上有很多討論一組空格可以直接放進去的部落格,次數就不說了。著重記錄一下以下情況 如 1 aaabbccddee,n 2 2 或者aabbcc,n 1...