思路:
首先我们需要统计出来出现次数最多的任务,先给出现最多的任务排序。
如:[A, A, A, A, A, A, B, B, B, C] n=2
先给A 排任务,注意冷却时间:
再给B排任务:
再给C排:
所有任务都排好了,我们来计算一下时间:
受冷却时间的影响,从第一层到第五层的所有时间块(包括空白)都要算作执行时间。max为A的任务数量=6。这部分的时间为:(max-1)*(n+1) = 5 *3 = 15
然后我们来看最后一层,最后一层不需要将冷却时间内的空白时间块算在执行时间内,所以我们只需统计最后一层的任务数量即可。将最后一层的任务数记为k。其中k=执行次数为max的任务数量。当前例子中执行次数为6的任务只有一个A,则k=1。
最后任务执行总时间为 (max-1)*(n+1)+k
还有一种情况,那就是当大部分任务的执行时间都接近max,且max比冷却时间n大得多时。
如:[A, A, A, A, A, A, B, B, B, B, B, B, C, C, C, C, C, C, D, D, E] n=2
这时候,任务的执行总时间就是总任务数
所以总执行时间=Math.max((max-1)*(n+1)+k, 总任务数)
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] t = new int[26];
int max = 0;
for(int i=0;i<tasks.length;i++)
{
int num = tasks[i]-'A';
t[num]++;
if(t[num]>max)
{
max = t[num];
}
}
int k = 0;
for(int i:t)
{
if(i==max)
k++;
}
int times = (max-1)*(n+1)+k;
return Math.max(times,tasks.length);
}
}