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():答;   }   };
原文地址:https://www.cnblogs.com/joelwang/p/11892943.html