leetcode621——Task Scheduler

题目大意:给出字符数组表示任务列表,26个大写字母代表26种任务。给出整数n,执行相同任务之间必须有长度为n的冷冻时间。CPU在每个单位时间可以选择执行任务或者待命,求完成这些任务所需要的最短时间。

分析:方法一:贪心法。贪心策略:尽早安排出现次数较多的任务。因为如果把他们留在后面,就会造成大量的冷冻时间。做法:每一轮选择剩余出现次数最多的不超过n+1个任务来执行,这样保证了冷冻时间。在每一轮中按照任务出现次数降序的顺序执行。

代码:

方法一:

class Solution {
public:
    int leastInterval(vector& tasks, int n) {
        vector 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;
    }
};

 

你可能感兴趣的:(贪心法)