leetcode 621 任务调度器 Task Scheduler

2023-03-03,,

给定一个用字符数组表示的 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, 10000]。
    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(,);
int ans=-; 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-)*(n+)+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():答;
  }
  };

leetcode 621 任务调度器 Task Scheduler的相关教程结束。

《leetcode 621 任务调度器 Task Scheduler.doc》

下载本文的Word格式文档,以方便收藏与打印。