每个任务要隔n个时间,使用贪心,尽量把数量多的任务提前执行,中间的数量少的任务可以提供缓冲时间。
使用优先队列,由于每个任务需要隔n时间,直接遍历n+1个时间。
执行完一次的但剩下的数量不是0的任务,放在一个缓冲地方,不要放入队列里,不然会扰乱队列。
遍历完n+1个时间,再把临时存放的任务再放回队列里。
struct Node{
char c;
int count;
};
bool operator<(const Node &a,const Node&b){
return a.count<b.count;
}
class Solution {
public:
map<char,int> count;
int leastInterval(vector<char>& tasks, int n) {
for(int i=0;i<tasks.size();i++){
count[tasks[i]]++;
}
priority_queue<Node> q;
for(auto &kv:count){
Node node;
node.c=kv.first;
node.count=kv.second;
q.push(node);
}
int time=0;
while(!q.empty()){
vector<Node> q2;
for(int i=0;i<n+1;i++){
if(!q.empty()){
Node node=q.top();
q.pop();
node.count--;
if(node.count>0)
q2.push_back(node);
}
else if(q2.empty()){
break;
}
time++;
}
for(Node & node:q2){
q.push(node);
}
}
return time;
}
};