621. Task Scheduler

一、题目

  1、审题

  

  2、分析

    输入为任务数组,且相同的任务只有在距离 n 之后才能,才能再做。求最少处理时间。

 

二、解答

  

  ①  首先统计出数组中,出现字符最多的次数 max, 出现次数最多的字符有几种 maxCount;

  ② 将出现次数最多的字符作为批次的划分,共有 max - 1 批空槽等待填写任务。

  ③ 每一批空槽有 n - (maxCount - 1) 个空槽位置

  ④ 除了已填写的最大批次任务还剩下的作业数 tasks.length - max * maxCount

  ⑤ 若 emptySlots > availableTasks 意味着没有足够的任务来填满空槽。则需要的处理时间为,返回总槽数 + 填写的最大任务数

  ⑥ 若 emptySlots <  availableTasks 意味着有足够的任务填写槽。剩下的任务可以足够分开添加在各个槽批次的末尾。则需要的处理时间为 tasks.length

    public int leastInterval(char[] tasks, int n) {
        int[] counter = new int[26];
        int max = 0;    // 出现的字符最多的次数
        int maxCount = 0;    // 统计出现次数最多的字符有几种种类,eg 3A3B3C。 则为 2 AB
        for(char task: tasks) {
            counter[task - 'A']++;
            if(max == counter[task - 'A'])
                maxCount++;
            else if(max < counter[task - 'A']) {
                max = counter[task - 'A'];
                maxCount = 1;
            }
        }
        int partCount = max - 1;    // 空槽有几批
        int partLength = n - (maxCount - 1);    // 每一批空槽有几个空槽位置
        int emptySlot = partCount * partLength;    // 总的空槽个数
        int availableTasks = tasks.length - max * maxCount;    // 除了 AB 还剩下的作业数
        int idles = Math.max(0, emptySlot - availableTasks);     //  emptySlots > availableTasks 意味着没有足够的任务来填满空槽
        return tasks.length + idles;
    }

 

posted @ 2019-05-27 15:48  skillking2  阅读(77)  评论(0编辑  收藏