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():答;   }   };
  • 相关阅读:
    迭代器和生成器
    案例:复制大文件
    案例:使用seek倒查获取日志文件的最后一行
    Leetcode165. Compare Version Numbers比较版本号
    Leetcode137. Single Number II只出现一次的数字2
    Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
    Leetcode116. Populating Next Right Pointers in Each Node填充同一层的兄弟节点
    Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表
    Leetcode113. Path Sum II路径总和2
    C++stl中vector的几种常用构造方法
  • 原文地址:https://www.cnblogs.com/joelwang/p/11892943.html
Copyright © 2011-2022 走看看