給定一個用字符數(shù)組表示的 CPU 需要執(zhí)行的任務列表。其中包含使用大寫的 A - Z 字母表示的26 種不同種類的任務。任務可以以任意順序執(zhí)行,并且每個任務都可以在 1 個單位時間內執(zhí)行完。CPU 在任何一個單位時間內都可以執(zhí)行一個任務,或者在待命狀態(tài)。
然而,兩個相同種類的任務之間必須有長度為 n 的冷卻時間,因此至少有連續(xù) n 個單位時間內 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]。
方法一 排序
思路:
1、將任務按頻率排序
2、n+1個任務為一輪,每輪中任務不重復
時間復雜度O(time)
空間復雜度O(1)
let leastInterval = function(tasks, n){
let last = 0,
result = 0,
arr = new Array(26);
arr.fill(0);
tasks.forEach(item => {
let index = item.charCodeAt() - 'A'.charCodeAt();
arr[index] += 1
})
//如果有剩余任務
while(arr[0] > 0){
last = 0;
//每輪任務重新排序
arr.sort((a, b) => b - a)
for(let i = 0; i < n + 1; i++){
if(arr[i] > 0){
arr[i] = arr[i] - 1;
}else{
//最后一輪多余的時間
last += 1;
}
result += 1;
}
}
return result - last;
}