Task Scheduler

1.解析

題目大意,求解最優的系統調度時間。要求,兩個相同任務之間的時間間隔不能小於n

2.分析

這道題沒什麼套路,我個人感覺還是比較難的,尤其題目意思,解題思路也不是很容易想到。我最初看到求解最值,我以爲是動態規劃。參考 @Grandyang博主的思路,講解的很清晰。

我們可以先看一個例子,例如:['A', 'B', 'A', 'B','A','B','C']     n = 2

既然要達到最優,我們就希望系統休息的時間越短越好。故那個任務出現的次數多,那麼誰就排在前面,採用數組進行統計每個任務出現的次數,優先先安排出現次數多的

'A''B'-     'A''B'-     'A''B'

即按照塊進行劃分,如果任務出現次數最多的存在多個,那麼我們就將其排在一塊,設mx爲所出現次數最多的個數,mx_Cnt爲相同的個數(最多的),如上所示,'A'任務出現的次數和'B'任務出現的次數都爲3,故mx = 3, mx_Cnt = 2, 所劃分的模塊的個數partSize = mx - 1 = 2; 

每個模塊還可以繼續填充任務的個數用emptySlot表示,emptySlot = n + 1 - mx_Cnt = 1;

還未填充的任務可以用:idles = 所有任務的個數(tasks.size()) - 已經填充的任務(mx * mx_Cnt ) 

所以系統執行完所花的時間間隔爲:所有任務的個數 + 還剩下的空格(emptySlot -idles )

語言有點難描述,具體實現參考如下:

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        int mx = 0, mx_Cnt = 0; //mx---出現的最多任務個數,mx_cnt---最多任務的個數
        vector<int> count(26, 0);
        for (auto task : tasks){ //統計最多任務的個數以及對應的數量
            if (++count[task-'A'] == mx){
                ++mx_Cnt;
            }
            else if (count[task-'A'] > mx){
                mx = count[task-'A'];
                mx_Cnt = 1;
            }
        }
        int partSize = mx - 1; //模塊的個數
        int partEmpty = n + 1 - mx_Cnt; //還未填充任務的個數
        int emptySlot = partSize * partEmpty; //可以繼續填充的任務個數
        int leaveTasks = tasks.size() - mx * mx_Cnt; //待填充的任務個數
        int idles = max(0, emptySlot - leaveTasks);
        return tasks.size() + idles;
    }
};

 [1]https://www.cnblogs.com/grandyang/p/7098764.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章