算法练习帖--16--任务调度器(Java)

给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

(题目来源:力扣网)

示例 :

输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
     在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,
     而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 

解决方法一(排序):

 public int leastInterval(char[] tasks,int n){
        //新建一个map数组,足以存放26个不同种类调度
        int[] map=new int[26];
        //计算tasks字符数组中 每个种类调度的次数存入map数组中
        for (char c : tasks) {
            map[c-'A']++;
        }
        //将map排序,目的是将最多次数的调度放到最后,取的时候第一个取
        Arrays.sort(map);
        //调度所需时间
        int time=0;
        //当最多次数的调度大于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++;
            }
            //每调度完n次排序map一次,保证最大次数的任务永远在map[25]
            Arrays.sort(map);
        }
        return  time;
    }

解决方法二(设计法):

public int leastInterval2(char[] tasks, int n) {
        //新建一个map数组,足以存放26个不同种类调度
        int[] map = new int[26];
        //计算tasks字符数组中 每个种类调度的次数存入map数组中
        for (char c: tasks){
            map[c - 'A']++;
        }
        //将map排序
        Arrays.sort(map);
        //获取最多次数的任务,和花费时间总数(除了最多数任务所花费的时间,没有计算在内)
        int max_val = map[25] - 1, idle_slots = max_val * n;
        //每循环一次,花费时间总数就要减去当前任务的次数
        //结果就是中间所有的待命时间
        for (int i = 24; i >= 0 && map[i] > 0; i--) {
            idle_slots -= Math.min(map[i], max_val);
        }
        //总待命时间<=0说明刚刚好,直接返回任务的总数就可以了
        //总待命时间>0说明不够,总时间=总待命时间+任务的总数(每个任务一秒)
        return idle_slots > 0 ? idle_slots + tasks.length : tasks.length;
    }

更多解法:(任务调度器解决方法)

你可能感兴趣的:(算法,leetcode,java,算法)