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;
}
};