【LeetCode笔记】621. 任务调度器(Java、桶)
文章目录
- 题目描述
- 代码 && 思路
- 1. 直白的 ac 做法 O(n)、O(n)
- 2. 桶排思想的做法 O(n)、O(n)
- 二刷
打卡第十六天~
题目描述
- 有点阅读题的意思,可以结合例子理解一下题干~
代码 && 思路
1. 直白的 ac 做法 O(n)、O(n)
- 同样是 O(n) 复杂度,比方法2慢了不少= =,不过胜在容易想~
- wait[i]:记录 i 的等待冷却时间
- counts[i]:记录 i 的剩余任务数量
- 设计思路很简单,每次都选取当前不在冷却的、数量最多的任务,没有就待命即可
class Solution {public int leastInterval(char[] tasks, int n) {// 按照顺序来,max 的先来int taskNums = tasks.length;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;}int[] wait = new int[26];int time = 0;while(taskNums != 0) {int index = chooseTask(counts, wait);// 不待命的情况if(index != -1) {// System.out.println("选择" + (char)('A' + index));counts[index]--;taskNums--;}else {// System.out.println("待命");}updateWait(wait, index, n);time++;}return time;}public void updateWait(int[] wait, int index, int n) {for(int i = 0; i < 26; i++) {if(wait[i] < 0) {wait[i]++;}}if(index != -1) {wait[index] = -n;}}public int chooseTask(int[] counts, int[] wait) {int index = -1;int max = Integer.MIN_VALUE;for(int i = 0; i < 26; i++) {// 未冷却,且存在的最大值if(wait[i] == 0 && counts[i] > max && counts[i] > 0) {max = counts[i];index = i;}}return index;}
}
2. 桶排思想的做法 O(n)、O(n)
- 参考了这篇题解的做法
- 步骤一:counts[ ] 记录各个任务的数量,维护最多任务数 maxTimes
- 步骤二:找到拥有 maxTiems 的任务种类数 maxTaskCounts
- 步骤三:根据公式计算结果:(maxTimes - 1) * (n + 1) + maxTaskCounts,如果公式结果小于 tasks.length,则选 tasks.length,否则选公式结果。
- 原理相关:直接看上面链接的题解吧,结合图片方便理解,我这里就不误人子弟了= =
- 关键点:
- 步骤三对应两种情况:有待命、无待命。
- 最后一趟无需再等待 n
class Solution {public int leastInterval(char[] tasks, int n) {// 桶排思想// 1. 先找到 maxTimesint maxTimes = 0;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;maxTimes = Math.max(maxTimes, counts[c - 'A']);}// 2. 找到并列 maxTimes 的字符数 maxTaskCountsint maxTaskCounts = 0;for(int num : counts) {if(num == maxTimes) {maxTaskCounts++;}}// 3. 返回 task.length || (maxTimes - 1) * (n + 1) + maxTaskCountsreturn Math.max(tasks.length, (maxTimes - 1) * (n + 1) + maxTaskCounts);}
}
二刷
- 诶嘿,二刷终于是有了更好理解了,对于最后一行的return:
- 如果说数量足够多,那么就相当于无空闲时间,直接取最大的 task.length 即可
- 如果说数量不够,那么 length 铁定不能取,同时也肯定小于有空闲公式的值。
- 因此总的来说,得 max !
class Solution {public int leastInterval(char[] tasks, int n) {int maxRow = 0;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;maxRow = Math.max(counts[c - 'A'], maxRow);}int maxCol = 0;for(int element : counts) {if(element == maxRow) {maxCol++;}}return Math.max(tasks.length, (maxRow - 1) * (n + 1) + maxCol);}
}
【LeetCode笔记】621. 任务调度器(Java、桶)相关推荐
- java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...
折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...
- leetcode 621. Task Scheduler | 621. 任务调度器(Java)
题目 https://leetcode.com/problems/task-scheduler/ 题解 似懂非懂的答案,https://leetcode-cn.com/problems/task-sc ...
- LeetCode 621. 任务调度器(贪心)
1. 题目 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完 ...
- LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)
dsadas /**思路:找下一个排列,并且尽可能小,所以我们应该找一序列中从左边开始的"较小值"与"较大值"交换,但是为了尽可能小应该满足: 1." ...
- Leetcode 621. 任务调度器 解题思路及C++实现
方法一:贪心算法 解题思路: 使用贪心的思想,先把出现最多的任务分配了(即每隔n个单位时间分配一个任务),然后再把其它任务填上.如下图 所以需要先计算各任务出现的次数,找到出现最多的任务,程序中使用m ...
- leetcode 621. 任务调度器(贪心算法)
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表.其中每个字母表示一种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.在任何一个单位时间,CPU ...
- leetcode - 621. 任务调度器
给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.CPU 在 ...
- 621. 任务调度器
文章目录 1.题目 2.代码 1.题目 题目要求 eg: 输入: tasks = ["A","A","A","B",&q ...
- LeetCode第 621 题:任务调度器 (C++)
621. 任务调度器 - 力扣(LeetCode) 做法很多,这位同学的解释是最通俗易懂的:[任务调度器]C++ 桶子_配图理解 class Solution { public:int leastIn ...
最新文章
- SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★
- Android关于notification的在不同API下的用法说明
- .Net开源 Shuttle(飞梭)服务总线(ESB)入门
- PID控制器开发笔记之四:梯形积分PID控制器的实现
- 企业微信加密消息体_用企业微信小程序发送消息
- jsoup 简单应用
- @程序员,别再让 Hotplug 问题难住你!
- WINDOWS系统自动登录设置
- python线程监控_Python监控php-fpm进程
- 用flash做古诗动画_Flash制作跟我学 用遮罩技术制作古诗动画-FLASH课件制作(FLASH课件制作教程)-flash课件吧(湖北金鹰)...
- 明解c语言中级篇微盘,明解C语言:中级篇
- 用python计算工程量_总算懂了工程造价工程量计算方法
- Pygame实战之外星人入侵NO.7——大批外星人来袭
- 前端 vue + element + vux
- java 模板函数_重温Java中的模板方法设计模式
- Arista教你如何讨容器、白盒基础架构数据中心玩家的欢心
- 新手引导功能的四种姿势
- SQL 修改日期类型,只修改年月日不修改时分秒
- java设计模式——门面与调停
- 人工智能_游戏AI –行为树简介
热门文章
- Ubuntu 16.04 安装 Matlab2016a
- tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...
- 怎么查询mysql的语法_mysql查询语法
- C++一位的字符数字转数字
- TensorFlow打印一个tensor值报错
- Python 读写配置文件模块: configobj 和 configParser
- 联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑接口评测-ZOL中关村在线...
- 实况服务器制作,用Highcharts预处理实时数据及实况图表制作
- mysql权限分立_MySQL设置3权分立
- linux配置网卡自动获取的命令,linux 命令行下配置网卡自动获取 IP