題目描述:
給定一個用字符數(shù)組表示的 CPU 需要執(zhí)行的任務列表。其中包含使用大寫的 A - Z 字母表示的26 種不同種類的任務。任務可以以任意順序執(zhí)行,并且每個任務都可以在 1 個單位時間內(nèi)執(zhí)行完。CPU 在任何一個單位時間內(nèi)都可以執(zhí)行一個任務,或者在待命狀態(tài)。
然而,兩個相同種類的任務之間必須有長度為 n 的冷卻時間,因此至少有連續(xù) n 個單位時間內(nèi) CPU 在執(zhí)行不同的任務,或者在待命狀態(tài)。
你需要計算完成所有任務所需要的最短時間。
示例 1:
輸入: tasks = ["A","A","A","B","B","B"], n = 2
輸出: 8
執(zhí)行順序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
注:
任務的總個數(shù)為 [1, 10000]。
n 的取值范圍為 [0, 100]。
思路:
完成所有任務的最短時間取決于出現(xiàn)次數(shù)最多的任務數(shù)量。
1、由于兩個相同種類的任務之間必須有長度為 n 的冷卻時間,因此我們先把出現(xiàn)次數(shù)最多的任務A安排上,上面例子中n=2,那么任意兩個A任務之間必須要有2個單位的時間:
A -> (單位時間) -> (單位時間) -> A -> (單位時間) -> (單位時間) -> A
2、中間間隔的單位時間可以用來安排別的任務,也可以處于“待命”狀態(tài)。當然為了是任務在最短時間內(nèi)完成,我們需要把間隔的單位時間盡可能的安排其他任務,現(xiàn)在我們把B任務也安排上:
A -> B -> (單位時間) -> A -> B -> (單位時間) -> A -> B
3、我們能夠看出,前面2個A任務一定會跟著2個單位時間間隔(最后一個A是否還有任務跟隨,取決于是否存在與A任務出現(xiàn)次數(shù)相同的B任務。)
上面執(zhí)行順序的規(guī)律是: 有count - 1個A(count為A任務的出現(xiàn)次數(shù)),其中每個A需要搭配n個單位時間,再加上最后一個A,所以總時間為 (count - 1) * (n + 1) + 1=(3-1)*(2+1)+1=7;
4、可能會出現(xiàn)多個頻率相同的任務,比如 ["A","A","A","B","B","B","C","C"],所以最后會剩下一個A和一個B,因此最后要加上頻率相同的不同任務的個數(shù);
5、公式算出的值可能會比數(shù)組的長度小,如["A","A","B","B"],n = 0,此時要取數(shù)組的長度。
Java解法:
class Solution {
public int leastInterval(char[] tasks, int n) {
int len = tasks.length;
if (len <= 1 || n < 1){
return len;
}
int[] counts = new int[26];
for (int i = 0; i < len; i++)
{
counts[tasks[i]-'A']++;
}
Arrays.sort(counts);
int maxCount = counts[25];
int ans = (maxCount - 1) * (n + 1) + 1;
int j = 24;
while (j >= 0 && counts[j] == maxCount)
{
ans++;
j--;
}
return Math.max(ans, len);
}
}
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers