zoukankan      html  css  js  c++  java
  • leetcode621 任务调度器(Medium)

    题目来源:leetcode621 任务调度器

    题目描述:

    给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

    然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

    你需要计算完成所有任务所需要的最短时间。

    示例 :

    输入:tasks = ["A","A","A","B","B","B"], n = 2
    输出:8

    解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
    在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。

    提示:

    任务的总个数为 [1, 10000]。
    n 的取值范围为 [0, 100]。

    解题思路:

    方法一:数学思想

    先把任务最多的排好,至少需要(n+1)(max-1)+1,如果出现同样最多的任务,那么除了在空余位置插空外,也要加1。最后和任务总数比较,如果任务总数更多的话,返回任务总数。具体看代码。

    class Solution {
    public:
        int leastInterval(vector<char>& tasks, int n) {
            map <char,int> s;
            int i=0,count=0,ans;
            for(i=0;i<tasks.size();i++)
                s[tasks[i]]++;//用map保存每个任务出现的次数
            for(i=0;i<s.size();i++)
                if(s[i]>count) count=s[i]; //出现最多的字母
            ans=(n+1)*(count-1);//以它来计算最长时间比如题目中为A**A**A,最后一个A在下一个遍历加上
            for(i=0;i<s.size();i++)
                if(s[i]==count) ans++;// 如果有出现相同最多次的,也加上,题目中为A,B,加上2
            return ans>tasks.size()?ans:tasks.size();//结果可能比tasks.size()短,此时选择tasks.size()
        }
    };
    //给一堆用大写字母表示的任务,相同的任务最少间隔n个时间才能执行,求任务全部执行完的最短CPU间隔
    

    方法二:优先队列
    也是先安排任务多的,使用一个优先队列保存每个任务出现的次数,每n+1个为1轮分配,再将这n+1中任务的数量减一,重新加入队列中,直到队列为空,分配完成。

    class Solution {
    public:
        int leastInterval(vector<char>& tasks, int n) {
            map<int,int> m;
            int i,ans=0;;
            for(i=0;i<tasks.size();i++)
                m[tasks[i]]++;
            priority_queue<int> pq;
            vector<int> tmp;
            for(auto t:m){
                pq.push(t.second);
            }
            while(!pq.empty()){
                tmp.clear();
                int i=0;
                while(i<=n){
                    if(!pq.empty()){
                        int t=pq.top();
                        pq.pop();
                        if(t>1){
                            t--;
                            tmp.push_back(t);
                        }
                    }
                    ans++;
                    if(pq.empty()&&tmp.empty()) break;
                    i++;
                }
                for(int t:tmp) pq.push(t);
            }
            return ans;
        }
    };
    
  • 相关阅读:
    macbook 无声音解决方案
    webapck dev server代理请求 json截断问题
    百度卫星地图开启
    服务器 nginx配置 防止其他域名绑定自己的服务器
    记一次nginx php配置的心路历程
    遇到npm报错read ECONNRESET怎么办
    运行svn tortoiseSvn cleanup 命令失败的解决办法
    svn add 命令 递归目录下所有文件
    m4出现Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
    Ubuntu下安装GCC,mpc、mpfr、gmp
  • 原文地址:https://www.cnblogs.com/yjcoding/p/13224146.html
Copyright © 2011-2022 走看看