[LeetCode]621. Task Scheduler 任务安排 题解
题目描述
给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成。但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位。球最少数量的时间单位完成所有任务。
思路
先要找到最大的任务个数x,若总任务类数>=n,则时间至少为(x-1)*(n+1)+最大值类数;但是对于特殊情况:4A3B3C3D,n=2,则使用原来的思路(先放最多类的,再按照类别从前往后填空) 不能获得最小值。所以没有做出来。
Solution
总结了一下,LeetCode上的达人们的思路主要有这样几种:
- 先统计词频,再排序,从后往前找到第一个不是最大词频的下标i,结果是tasks.length或(c[25] - 1) * (n + 1) + 25 – i中大的那一个,25-i就是最大词频的任务类,这个和我的思路是一样的。证明:最大词频是k,则创建k个块,每一块开头是最大词频的任务构成的(输入AACCCDDEEE,则开头是CE),词频由大到小插入每一块。97.69%,10ms。
- 贪心,利用优先队列排序:队列中保存<类型,个数>的map,并且按照个数由大到小排序。按照词频由大到小取出n+1个或者队列中全部(若没有取出全部,则总长度要加上空闲个数),再把词频-1之后不为0的放回队列中。直到队列空了为止。——其实也和前面相同,总是选择词频最大的填入每一块。
- 使用操作系统的思想,在时间为time的时候,把time-1-n冻结的任务放回等待队列waitingQueue,在一个循环结束的时候,如果还有这一类task待完成,放到tasksTable。具体做法:先用HashMap统计词频,再用优先队列waitingQueue排序,声明一个冷却HashMap表coolDownTable,当队列不空或者冷却表不空的时候,找到冷却表time-n-1对应的任务char,拿出放到等待队列中,如果等待队列不空{拿出任务,剩余任务个数-1并放到tasksTable,如果剩余任务个数不为0放到coolDownTable.put(time, task); } time++。返回time
- 类似上面,模拟的思想:对于m个任务,先是每类任务的冷却时间-1,然后找到词频最大的任务及其下标,如果它的词频>-1,则取这个任务(词频-1,处理++,冷却时间+n);否则(所有任务词频都为-1),空闲+1.返回处理+空闲时间
代码
只是实现了第一个solution的代码:
public int leastInterval(char[] tasks, int n) {
int[] freq=new int[26];
int maxFreq=0,maxFreqCount=0;
for(int i=0;i<tasks.length;i++){
freq[tasks[i]-'A']++;
}
for(int i=0;i<26;i++){
if(freq[i]>maxFreq){
maxFreq=freq[i];
maxFreqCount=1;
}else if(freq[i]==maxFreq){
maxFreqCount++;
}
}
return Math.max(tasks.length,(maxFreq-1)*(n+1)+maxFreqCount);
}
[LeetCode]621. Task Scheduler 任务安排 题解的更多相关文章
- LeetCode 621. Task Scheduler
原题链接在这里:https://leetcode.com/problems/task-scheduler/description/ 题目: Given a char array representin ...
- [leetcode]621. Task Scheduler任务调度
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- [LeetCode] 621. Task Scheduler 任务调度
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- [leetcode] 621. Task Scheduler(medium)
原题 思路: 按频率最大的字母来分块,频率最大的字母个数-1为分成的块数,每一块个数为n+1 比如AAABBCE,n=2, 则分为A-A- +A AAABBBCCEE,n=2,则分为AB-AB- +A ...
- 【LeetCode】621. Task Scheduler 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 公式法 日期 题目地址:https://leetco ...
- 621. Task Scheduler
https://www.cnblogs.com/grandyang/p/7098764.html 将个数出现最多的那个字符作为分隔的标准,一定是最小的.所以这个时候只需要计算还需要添加多少个idel就 ...
- 621. Task Scheduler CPU任务间隔分配器
[抄题]: Given a char array representing tasks CPU need to do. It contains capital letters A to Z where ...
- Windows Task Scheduler Fails With Error Code 2147943785
Problem: Windows Task Scheduler Fails With Error Code 2147943785 Solution: This is usually due to a ...
- 在Windows Server 2012的Task Scheduler里面配置自动发送邮件
最近在一台server上配置了每个周末备份数据库的定时任务,想顺手配置发送备份完成的邮件提醒我去Double Check一下备份结果. 悲剧地发现Send an email功能被新版的server给禁 ...
随机推荐
- 基于 Helm 快速部署 Wordpress
Helm 是 Kubernetes 中的一个开源软件包管理工具,Rainbond 从 5.3.1 版本开始支持部署 Helm 应用.实现 Helm 应用的便捷部署,访问控制.使 Rainbond 用户 ...
- [Emlog主题] Monkey V3.0 优化修改
原作者博客:https://blog.dyboy.cn/ Monkey V3.0 优化修改版 修改说明: 背景颜色修改(按个人喜好可自行修改,仿PCQQ午夜巴黎皮肤) 搜索框按钮样式优化,不那么突兀了 ...
- 启动spark-shell --master yarn的bug
报错如下 18/06/06 15:55:31 ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited ...
- vue3 使用 data、computed、methods
简单数据ref复杂数据reactive 使用方法: // useCount.js import {ref,reactive,computed} from 'vue' export default fu ...
- git pull、git fetch、git merge、git rebase的区别
一.git pull与git fetch区别 1.两者的区别 两者都是更新远程仓库代码到本地. git fetch相当于是从远程获取最新版本到本地,不会自动merge. 只是将远程仓库最新 ...
- tomcat启动和停止脚本
#!/bin/bash JDK_HOME=/apps/jdk1.7.0_79 CATALINA_HOME=/apps/tomcat export JDK_HOME CATALINA_HOME sour ...
- OpenStack之五: image镜像服务(端口9292)
官网地址:https://docs.openstack.org/glance/stein/install/install-rdo.html #:创建glance库,并授权 MariaDB [(none ...
- js将数字转为千分位/清除千分位
/** * 千分位格式化数字 * * @param s * 传入需要转换的数字 * @returns {String} */ function formatNumber(s) { if (!isNaN ...
- Vue.js 学习
一,Vue.js 介绍 Vue 是一套用于构建用户界面的渐进式javascript框架,与其它大型框架不同的是:Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,不仅易于上手,还便于与第 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(11. 构建复杂的高可用网络)
1. 简介 flannel在实战阶段貌似不能胜任在灾难恢复时候异地的网络,打算用openvswith试试