任务调度器leetcode621
问题(来自LeetCode):
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。
然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的 最短时间 。
示例 1:
输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。
示例 2:输入:tasks = ["A","A","A","B","B","B"], n = 0
输出:6
解释:在这种情况下,任何大小为 6 的排列都可以满足要求,因为 n = 0
["A","A","A","B","B","B"]
["A","B","A","B","A","B"]
["B","B","B","A","A","A"]
...
诸如此类
示例 3:输入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2
输出:16
解释:一种可能的解决方案是:
A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A提示:
1 <= task.length <= 104
tasks[i] 是大写英文字母
n 的取值范围为 [0, 100]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/task-scheduler
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
对于冷却时间 n,我们构造一个长为n+1,高为“任务需要执行的最多次数”的表格。n+1意义,其中1表示执行任务A需要1个时间单位,n表示执行任务后需要等待n个时间单位才能继续执行任务A。
其中任务是行优先的顺序执行
填充表格的方法:
设:任务需要需要执行的最多次数为maxExec,需要执行maxExec次的任务有maxCount个
1、优先把最长任务填充到最左边的列,那么剩下的任务的执行次数都会少于maxExec,这个时候把他们从“空位的靠左侧,倒数第二行开始,从下往上,从左到右填充到表格”。
填充完之后,我们会遇到两种情况:
1)填充后,表格还剩余“空列”,这个时候,有多少个空列,CPU就需要“待命”多少个单位时间。如下图。如果任务“按行优先,从左到右,从下往上执行”,那么,总执行时间就是前maxExec-1行的面积加上maxCount。即 (maxExec-1)*(n+1)+ maxCount
(图来自leetcode)
2)填充后,发现表格不够填,要超出表格的列数。如下图
(图来自leetcode)
这个时候,如果任务“按行优先,从左到右,从上往下执行”,那么同一个任务执行两次之间肯定至少间隔n个单位的时间,即肯定满足条件,那么我们只需要计算彩色部分的面积就行啦,即总任务数time = |task|
综上:当表格没超载的时候的时候,|task| <(maxExec-1)*(n+1)+ maxCount
当表格超载的时候 |task| >(maxExec-1)*(n+1)+ maxCount
所以,只需要取最大值即可。
代码实现的关键是计算出maxExec、maxCount、 |task|
class Solution {
public:int leastInterval(vector<char>& tasks, int n) {unordered_map<char,int> freq;for(char &task:tasks)freq[task]+=1;int maxExec = max_element(freq.begin(),freq.end(),[](const auto& u,const auto& v){return u.second<v.second;})->second;int maxCount = accumulate(freq.begin(),freq.end(),0,[=](int acc,const auto& u){return acc+(maxExec==u.second);});int num_tasks = tasks.size();return max(num_tasks,(maxExec-1)*(n+1)+maxCount);}
};
任务调度器leetcode621相关推荐
- LeetCode-621. 任务调度器
621. 任务调度器 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时 ...
- 基于单片机的简单的任务调度器
近来工作之余,研究了一下APM的源码. APM源码连接https://pan.baidu.com/s/17Dg1oEJT_fj12DM1BmZWxA 发现源码中有一个简单的任务调度器,不太重要的任务都 ...
- java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...
折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...
- 从零入门 FreeRTOS 操作系统之任务调度器
从零入门 FreeRTOS 操作系统之任务调度器 1 任务调度器的概念 FreeRTOS 中提供的任务调度器是基于优先级的全抢占式调度:在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是 ...
- 面试八股文:你写过自定义任务调度器吗?
最近入职了新公司,尝试阅读祖传代码,记录并更新最近的编程认知. 思绪由Q1引发,后续Q2.Q3基于Q1的发散探究 Q1. Task.Run.Task.Factory.StartNew 的区别? 我们常 ...
- 昇腾AI处理器软件栈--任务调度器(TS)
任务调度器与运行管理器工程组成软硬件之间的大坝系统.在执行时,任务调度器对硬件进行任务的驱动,为昇腾AI处理器提供具体的目标任务,与运行管理器一起完成任务调度流程,并将输出数据回送给运行管理器,充当了 ...
- 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- TaskScheduler一个.NET版任务调度器
TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式 ...
- 【Hadoop2.6】Yarn中任务调度器
概述 Yarn中有三种任务调度器:FIFO调度器(FIFO Scheduler).容量调度器(Capacity Scheduler).公平调度器(Fair Scheduler). 任务调度器介绍 1. ...
最新文章
- 什么是TypeScript?为什么我要用它代替JavaScript? [关闭]
- python读取excel表格-python读写Excel表格的实例代码(简单实用)
- C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎
- 如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库
- (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)
- 递归算法的总结与应用
- 股票休市午间可以撤单吗?
- Redis高可用之持久化
- 开发商微信选房后不退认筹金_新楼盘开盘的“认筹”和“认购”,劝您看懂后再去认!...
- dnn305的一个bug
- php获取qq音乐的api类,QQ音乐api接口梳理
- 富文本编辑器CKEditor配置与使用
- excel自动求和_Excel里面SUM函数增加行后数据自动加进去的方法
- Crate安装和配置
- 2020最新手机百度云不限速教程,下载速度10M/S,比会员还快
- 认识计算机选题背景,与计算机专业相关的论文_计算机专业的毕业论文题目有哪些_大一我对计算机的认识3000字论文...
- 推荐10本C#编程的最佳书籍
- python的argc与argv
- 汇编语言快速回顾(以x86_64为例)
- html2canvas解决图片空白,网络图片跨域