难度:中等
题目:
给你一个用字符数组
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]
Related Topics
- 贪心
- 数组
- 哈希表
- 计数
- 排序
- 堆(优先队列)
重点!!!解题思路
第一步:
我们是要获得一个解决所有任务的时间
根据示例一:
这里n为2,相同任务之间需要2个时间才能接着执行,
内部图形的宽度为A的数量,长度为n+1. (猜想)
第二步:
根据示例二:
![]()
这里n为0,
图形的宽度为A的数量,长度为n+1
第三步:
根据示例三:
剩下的任务数量都可以填入方块内
那么我们就不需要这个公式了,因为其中一些时间都没填满
如果用这个公式,我们任务时间反而还长了,
那么解决办法就是直接返回原来的任务长度,因为这个任务怎么相互插入都是一个时间
那就是原来任务所需要的时间
第四步:
由此可知公式为 (maxTime-1)*(n+1)+maxCount
源码:
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] arr=new int[26]; //定义一个英文单词总数 26位
for (int i=0;i<tasks.length;i++) { //计算任务中,每个任务的数量
arr[tasks[i]-'A']++; //这里tasks[0]='A','A'-'A'=0,那么arr[0]就+1
}
Arrays.sort(arr); //Array排序会将最大的数排列在最尾部,然后依次向前递减
int maxTime=arr[25]; //获取最多次数的任务
int maxCount=1; //因为图型是个不规则图型,我们截取为两部分,肯定会多出来一部分,那么这个多出来的初始值就是1
for (int i=25;i>=1;i--){ //遍历整个数组 从后往前
if (arr[i]==arr[i-1]){ //当此时数和前一个数相同时,多出来的一部分就+1
maxCount++;
}else { //直到数不相同停止,因为只有和最多次任务相同,才会在截取图形的多出来的一部分中
break;
}
}
return Math.max(tasks.length,(maxTime-1)*(n+1)+maxCount);//返回的任务时间公式就是(maxTime-1)*(n+1)+maxCount,如果如同示例三的情况 那么直接返回任务数量
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧