欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【刷题1】LeetCode 621. 任务调度器 java题解

程序员文章站 2022-03-04 21:10:10
...

题目

https://leetcode-cn.com/problems/task-scheduler/
【刷题1】LeetCode 621. 任务调度器 java题解

方法一

分析

在桶中从左到右,从上到下摆放。max是同一任务重复出现的最大次数,maxCount是达到最大次数的种类数。
假设n=2
情况1:种类数<=n+1
假设有 5 个 A,5 个 B, 2 个 C
最短时间=(n+1)*(max-1)+maxCount
【刷题1】LeetCode 621. 任务调度器 java题解
情况2:种类数>n+1
假设有 5 个 A,5 个 B, 3 个 C,2 个 D,2 个 E,2 个 F,1 个 G
最短时间=任务总数
【刷题1】LeetCode 621. 任务调度器 java题解

代码

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] count=new int[26];
        int max=0;//出现最多的任务
        for(char t:tasks){
            count[t-'A']++;
            max=Math.max(max,count[t-'A']);
        }
        int maxCount=0;//有几个出现最多的任务
        for(int c:count){
            if(c==max){
                maxCount++;
            }
        }
        return Math.max((n+1)*(max-1)+maxCount,tasks.length);
    }
}

复杂度

时间复杂度:O(M),其中 M 是任务的总数。
空间复杂度:O(1)。

结果

【刷题1】LeetCode 621. 任务调度器 java题解

方法二:排序

分析

我们规定 n + 1 个任务为一轮,这样的好处是同一轮中一个任务最多只能被安排一次。在每一轮中,我们将当前的任务按照它们剩余的次数降序排序,并选择剩余次数最多的 n + 1 个任务依次执行。

代码

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] map=new int[26];
        for(char t:tasks){
            map[t-'A']++;
        }
        Arrays.sort(map);
        int time=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]--;
                }
                time++;
                i++;
            }
            Arrays.sort(map);
        }
        return time;
    }
}

复杂度

时间复杂度:O(time),由于我们给每个任务都安排了时间,因此时间复杂度和最终的答案成正比。
空间复杂度:O(1)。

方法三:用优先队列排序