20200406——第六百二十一 任务调度器

排序

由于相同的任务之间必须有 n 的冷却时间,所以我们可以想到按照任务的数量来安排它们,即一种任务的出现次数越多,我们就越早地安排。例如有 5 种任务 A, B, C, D, E,且它们分别有 6, 1, 1, 1, 1 个时,假设冷却时间 n = 2,那么我们首先安排任务 A,随后在 2 单位的冷却时间里,我们安排任务 B, C,随后继续安排任务 A,再安排任务 D, E,以此类推。

因此我们得到了一种安排的方法:我们规定 n + 1 个任务为一轮,这样的好处是同一轮中一个任务最多只能被安排一次。在每一轮中,我们将当前的任务按照它们剩余的次数降序排序,并选择剩余次数最多的 n + 1 个任务依次执行。如果任务的种类 t 少于 n + 1 个,就只选择全部的 t 种任务,其余的时间空闲。这样做的正确性在于,由于冷却时间的存在,出现次数较多的那些任务如果不尽早安排,将会导致大量空闲时间的出现,因此贪心地将出现次数较多的任务安排在前面是合理的。同时我们可以保证,这一轮的第 k 个任务距离上一次执行至少有 n 个单位的冷却时间。我们可以使用逆向思维来证明:假设第 r 轮中某个任务在第 k 个执行,那么说明它在第 r 轮时为数量第 k 多的任务。在第 r 轮结束后,第 1 多到第 k 多的任务的数量都会减少 1,因此在第 r + 1 轮,这个任务最多也只能是数量第 k 多,因此它如果被执行,一定满足冷却时间的要求。

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] map = new int[26];
        for(char task :tasks){
            map[task - 'A']++;
        }
        Arrays.sort(map);
        int count = 0;
        while(map[25] >0){
            int i = 0 ;
            while(i<=n){
                if(map[25] == 0){
                    break;
                }
                if(i<26 &&map[25-i] >0){
                    map[25-i]--;
                }
                count++;
                i++;
            }
            Arrays.sort(map);
        }
        return count;
    }
}

在这里插入图片描述

发布了955 篇原创文章 · 获赞 43 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/105343428