LeetCode Hot 100 No.621 任务调度器

在这里插入图片描述
思路:
首先我们需要统计出来出现次数最多的任务,先给出现最多的任务排序。

如:[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);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值