文章目录

  • 题目描述
  • 代码 && 思路
    • 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,否则选公式结果。
  • 原理相关:直接看上面链接的题解吧,结合图片方便理解,我这里就不误人子弟了= =
  • 关键点:
    1. 步骤三对应两种情况:有待命、无待命。
    2. 最后一趟无需再等待 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:

    1. 如果说数量足够多,那么就相当于无空闲时间,直接取最大的 task.length 即可
    2. 如果说数量不够,那么 length 铁定不能取,同时也肯定小于有空闲公式的值。
    3. 因此总的来说,得 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、桶)相关推荐

  1. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...

    折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...

  2. leetcode 621. Task Scheduler | 621. 任务调度器(Java)

    题目 https://leetcode.com/problems/task-scheduler/ 题解 似懂非懂的答案,https://leetcode-cn.com/problems/task-sc ...

  3. LeetCode 621. 任务调度器(贪心)

    1. 题目 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完 ...

  4. LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)

    dsadas /**思路:找下一个排列,并且尽可能小,所以我们应该找一序列中从左边开始的"较小值"与"较大值"交换,但是为了尽可能小应该满足: 1." ...

  5. Leetcode 621. 任务调度器 解题思路及C++实现

    方法一:贪心算法 解题思路: 使用贪心的思想,先把出现最多的任务分配了(即每隔n个单位时间分配一个任务),然后再把其它任务填上.如下图 所以需要先计算各任务出现的次数,找到出现最多的任务,程序中使用m ...

  6. leetcode 621. 任务调度器(贪心算法)

    给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表.其中每个字母表示一种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.在任何一个单位时间,CPU ...

  7. leetcode - 621. 任务调度器

    给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.CPU 在 ...

  8. 621. 任务调度器

    文章目录 1.题目 2.代码 1.题目 题目要求 eg: 输入: tasks = ["A","A","A","B",&q ...

  9. LeetCode第 621 题:任务调度器 (C++)

    621. 任务调度器 - 力扣(LeetCode) 做法很多,这位同学的解释是最通俗易懂的:[任务调度器]C++ 桶子_配图理解 class Solution { public:int leastIn ...

最新文章

  1. SP11469 SUBSET - Balanced Cow Subsets(折半搜索+状态压缩)难度⭐⭐⭐⭐★
  2. Android关于notification的在不同API下的用法说明
  3. .Net开源 Shuttle(飞梭)服务总线(ESB)入门
  4. PID控制器开发笔记之四:梯形积分PID控制器的实现
  5. 企业微信加密消息体_用企业微信小程序发送消息
  6. jsoup 简单应用
  7. @程序员,别再让 Hotplug 问题难住你!
  8. WINDOWS系统自动登录设置
  9. python线程监控_Python监控php-fpm进程
  10. 用flash做古诗动画_Flash制作跟我学 用遮罩技术制作古诗动画-FLASH课件制作(FLASH课件制作教程)-flash课件吧(湖北金鹰)...
  11. 明解c语言中级篇微盘,明解C语言:中级篇
  12. 用python计算工程量_总算懂了工程造价工程量计算方法
  13. Pygame实战之外星人入侵NO.7——大批外星人来袭
  14. 前端 vue + element + vux
  15. java 模板函数_重温Java中的模板方法设计模式
  16. Arista教你如何讨容器、白盒基础架构数据中心玩家的欢心
  17. 新手引导功能的四种姿势
  18. SQL 修改日期类型,只修改年月日不修改时分秒
  19. java设计模式——门面与调停
  20. 人工智能_游戏AI –行为树简介

热门文章

  1. Ubuntu 16.04 安装 Matlab2016a
  2. tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...
  3. 怎么查询mysql的语法_mysql查询语法
  4. C++一位的字符数字转数字
  5. TensorFlow打印一个tensor值报错
  6. Python 读写配置文件模块: configobj 和 configParser
  7. 联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑接口评测-ZOL中关村在线...
  8. 实况服务器制作,用Highcharts预处理实时数据及实况图表制作
  9. mysql权限分立_MySQL设置3权分立
  10. linux配置网卡自动获取的命令,linux 命令行下配置网卡自动获取 IP