題目大意:給出字符數組表示任務列表,26個大寫字母代表26種任務。給出整數n,執行相同任務之間必須有長度爲n的冷凍時間。CPU在每個單位時間可以選擇執行任務或者待命,求完成這些任務所需要的最短時間。
分析:方法一:貪心法。貪心策略:儘早安排出現次數較多的任務。因爲如果把他們留在後面,就會造成大量的冷凍時間。做法:每一輪選擇剩餘出現次數最多的不超過n+1個任務來執行,這樣保證了冷凍時間。在每一輪中按照任務出現次數降序的順序執行。
代碼:
方法一:
class Solution {
public:
int leastInterval(vector<char>& tasks, int n) {
vector<int> m(26);
for(char c : tasks){
m[c - 'A']++;
}
sort(m.begin(),m.end());
int time = 0;
while(m[25]){ //當剩餘次數最多的任務次數不爲0,就需要新一輪安排
for(int i = 0;i <= n;i++){ //每輪最多n+1個任務
if(m[25] == 0) break;
if(i < 26 && m[25 - i])
m[25 - i]--;
time++; //執行任務或者待命
}
sort(m.begin(),m.end()); //每輪結束都要按任務剩餘次數重排序
}
return time;
}
};