621. 任務(wù)調(diào)度器

一 題目:

二 思路:

方法(貪心算法)
容易想到的一種貪心策略為:先安排出現(xiàn)次數(shù)最多的任務(wù),讓這個任務(wù)兩次執(zhí)行的時間間隔正好為n。再在這個時間間隔內(nèi)填充其他的任務(wù)。

例如:tasks = ["A","A","A","B","B","B"], n = 2

  • 我們先安排出現(xiàn)次數(shù)最多的任務(wù)"A",并且讓兩次執(zhí)行"A"的時間間隔為2。在這個時間間隔內(nèi),我們用其他任務(wù)類型去填充,又因為其他任務(wù)類型只有"B"一個,不夠填充2的時間間隔,因此額外需要一個冷卻時間間隔。具體安排如下圖所示:
  • 其中,maxTimes為出現(xiàn)次數(shù)最多的那個任務(wù)出現(xiàn)的次數(shù)。maxCount為一共有多少個任務(wù)和出現(xiàn)最多的那個任務(wù)出現(xiàn)次數(shù)一樣。
    圖中一共占用的方格即為完成所有任務(wù)需要的時間,即:
    (maxTimes - 1)*(n + 1) + maxCount

  • 此外,如果任務(wù)種類很多,在安排時無需冷卻時間,只需要在一個任務(wù)的兩次出現(xiàn)間填充其他任務(wù),然后從左到右從上到下依次執(zhí)行即可,由于每一個任務(wù)占用一個時間單位,我們又正正好好地使用了tasks中的所有任務(wù),而且我們只使用tasks中的任務(wù)來占用方格(沒用冷卻時間)。因此這種情況下,所需要的時間即為tasks的長度。
    由于這種情況時再用上述公式計算會得到一個不正確且偏小的結(jié)果,因此,我們只需把公式計算的結(jié)果和tasks的長度取最大即為最終結(jié)果。

作者:lan-se-bei-ban-qiu
鏈接:https://leetcode-cn.com/problems/task-scheduler/solution/jian-ming-yi-dong-de-javajie-da-by-lan-s-jfl9/
來源:力扣(LeetCode)

三 代碼:

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] buckets= new int[26];
        //統(tǒng)計每個元素出現(xiàn)的次數(shù)
        for (char task : tasks) {
            buckets[task-'A']++;
        }

        //按出現(xiàn)的次數(shù)進行排序
        Arrays.sort(buckets);
        
        //最先最多次數(shù)的字符的次數(shù)
        int maxTime=buckets[25];
        //maxCount為一共有多少個任務(wù)和出現(xiàn)最多的那個任務(wù)出現(xiàn)次數(shù)一樣。
        int maxCount=1;
        for (int i = 25; i >=1 ; i--) {
            if (buckets[i-1]==buckets[I]){
                maxCount++;
            }else {
                break;
            }
        }

        int res=(maxTime-1)*(n+1)+maxCount;

        //極端情況,如果任務(wù)種類多,不需要冷卻,直接就運行就ok,那么所需時間為任務(wù)的長度
        return Math.max(res,tasks.length);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容