题目大意:给出字符数组表示任务列表,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;
}
};