力扣刷题日记-621. 任务调度器

114 阅读2分钟

这道题之前尝试做过,没有做出来,今天看了左大佬的视频,豁然开朗了.自己改写了javascript版本的.

  • 思路:

    1. 首先找到出现次数最多的任务,并把这个最多次数存下来
    1. 可能不止一种任务出现最多次,所以还要知道哪些任务出现了最多次
    1. 按照出现最多次的任务数分组,
    1. 最后一组可以直接从任务总数中删除,因为任务都是插入到组与组的中间,不放最后端
    1. 计算出位置数
    1. 算出空格数,空格数是负数或者是0,统一取0
    1. 加上任务总长度,既可以得到最短的时间啦
  • 有空再补充图形演示

  • 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的 最短时间 。

 

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ta… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int leastInterval(char[] tasks, int n) {
        int[] count = new int[256];
        int maxCount = 0; // 出现多次的任务,到底出现了多少次
        for(char task:tasks) {
            count[task]++;
            maxCount = Math.max(maxCount, count[task]);
        }
        // 有多少中任务出现了最多次
        int maxKinds = 0;
        for(int task = 0; task < 256; task++) {
            if(count[task] == maxCount) {
                maxKinds++;
            }
        }
        // 砍掉最后一组剩余的任务数量
        int taskExceptFinalTeam = tasks.length - maxKinds;
        int spaces = (n + 1) * (maxCount - 1);
        int restSpaces = Math.max(0,spaces - taskExceptFinalTeam);
        return tasks.length + restSpaces;

    }
}


/**
 * @param {character[]} tasks
 * @param {number} n
 * @return {number}
 */
var leastInterval = function (tasks, n) {
    let map = new Map();
    let maxCount = 0;// 出现最多次数的任务到底出现了几次
    for (let i = 0; i < tasks.length; i++) {
        map.get(tasks[i]) ? 
        map.set(tasks[i], map.get(tasks[i])+1) 
        : map.set(tasks[i], 1)
        maxCount = Math.max(maxCount, map.get(tasks[i]))
    }
    // 有多少种任务出现最多次
    let maxCountTaskKinds = 0;
    for(let [task,taskCount] of map) {
        if(taskCount == maxCount) maxCountTaskKinds++
    }
    // 去掉最后一组任务数量
    let taskExceptFinalTeam = tasks.length - maxCountTaskKinds;
    let spaces = (n + 1) * (maxCount - 1);
    let restSpaces = Math.max(0, spaces - taskExceptFinalTeam)
    return tasks.length + restSpaces;
};