leetcode-621. 任务调度器

621. 任务调度器

假设有任务["A","A","A","B","B","B"],n=2,可以画图表示CPU的时间分配

  • MT表示maxTime,这个任务列表中出现次数最大的任务数量,这里就是MT=3

  • MC表示maxCount,在这个任务列表中与出现最多的任务次数相同的任务数目,包括这个出现次数最多的任务,比如这里的就是AB,MC=2

  • 要计算执行时间就是计算有内容格子的数目,计算公式为minWorkTime = (maxTime-1) * (n + 1) + maxCount

  • 考虑如下情况公式失效:得出结果偏小,我们更新计算公式为Math.max(minWorkTime, tasks.length)

    • 但是假如任务很多的时候,可能不需要考虑休息时间,公式偏小失效,格子数为数组长度

    • 假如出现次数最多的任务只有1个,可能不需要考虑休息时间,公式偏小失效,格子数为数组长度

    • 加入休息时间为0,直接按顺序依次执行即可,公式偏小失效,最终格子数就为数组长度

public int leastInterval(char[] tasks, int n) {
    public int leastInterval(char[] tasks, int n) {
        int[] bucket = new int[26]; //任务的执行,任务为26个字母
        for(int i = 0; i < tasks.length; i++){
            bucket[tasks[i] - 'A']++; //跟A做减法,找到所有字母任务执行的次数
        }
        Arrays.sort(bucket); //从小到大排序bucket,大的在最后一位
        int maxTime = bucket[25]; //需要执行次数最多的任务
        int maxCount = 1; //初始化和执行次数最多的任务执行次数一样的任务个数
        for(int j = 24; j >= 0; j--){ //从倒数第二个开始,倒序查看有无跟最多执行次数一样的
            if(bucket[j] == maxTime ){
                maxCount++; //有就++
            }else {
                //如果不和maxTime一样,直接跳出循环,提高效率
                break;
            }
        }
        int minWorkTime = (maxTime - 1) * (n + 1) + maxCount; //根据公式计算最小工作时长
        return Math.max(minWorkTime, tasks.length); //判断公式是否偏小失效
    }
}

 

posted on 2022-10-09 10:48  老菜农  阅读(91)  评论(0编辑  收藏  举报

导航