zoukankan      html  css  js  c++  java
  • leetcode 621 任务调度器 Task Scheduler

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

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

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

    示例 1:

    输入: tasks = ["A","A","A","B","B","B"], n = 2
    输出: 8
    执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
    

    注:

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

    思路记录:

    采用贪心算法:

    1 首先统计26种任务的频率,然后按照频率大小进行排序,记录最大的频率为k,共有p种任务的频率为k,可知p>=1。

    2 然后以n+1个任务为一组,并且总是先排频率最大的任务,可分为两种情况:

    a. 一种是频率最大的任务每一组都有,如对于

        tasks = [A A A A B B B C C D] N=3

    则是先排ABC_ABC_ABD_A,记作ans=(k-1)*(n+1)+p;

    b. 一种是频率最大的任务在最后一组之前就已经结束,如对

        tasks = [ A A B B C C D E] n=2

    则是 ABCABCDE, 此时ans=tasks.size();

    当算出来的ans<task.size()说明是后一种情况,因为ans的公式计算的是包含最大频率任务的所有任务的完成时间,如果计算出来的ans小于tasks的总任务数,说明并不是每一组都含有频率最高的任务

    C++ code: 建立一个count数组统计频率

    class Solution {
    public:
        int leastInterval(vector<char>& tasks, int n) {
            //max_count 最大频率,p 最大频率任务数目,n最小间隔时间;
            vector<int>count(26,0);
            int ans=-1;
    
            for(const char task: tasks){
                int id=task-'A';
                ++count[id];
            }
            int max_count = *max_element(count.begin(),count.end());
            
            int p=count_if(count.begin(),count.end(),[max_count](int c){return c==max_count;});
            ans=(max_count-1)*(n+1)+p;
            return tasks.size()>ans?tasks.size():ans;
        }
    };

    有道词典
    class Solution ...
    详细X
      {类解决方案   公众:   int leastInterval(向量< char > &任务,int n) {   向量< int >数(0);   int ans = 1;      (const char任务:任务){   int id =任务——“A”;   + +计数(id);   }   int max_count = * max_element (count.begin (), count.end ());      int p = count_if (count.begin (), count.end (), [max_count] (int c){返回c = = max_count;});   ans = (max_count-1) * (n + 1) + p;   返回tasks.size () > ans ? tasks.size():答;   }   };
  • 相关阅读:
    实验八 进程间通信
    实验七 信号
    实验六 进程基础
    实验五 shell脚本编程
    实验四 Linux系统C语言开发环境学习
    实验三 linux系统用户管理及VIM配置
    实验二 Linux系统简单文件操作命令
    实验一 linux系统与应用准备
    myatbis的一个好的封装
    php上传微信素材
  • 原文地址:https://www.cnblogs.com/joelwang/p/11892943.html
Copyright © 2011-2022 走看看