LeetCode刷题,任务调度器(621)

298 阅读1分钟

任务调度器

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

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

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

解题代码

思路:

  1. 如果任务列表中执行是没有待命时间,那么说明最短时间就是任务长度
  2. 如果有待命时间且无法通过执行其他类型的任务填充满待命时间,可由以下公式推导出
  3. 假设出现最多任务的次数是N次,有M种任务,同时出现了N次。假设冷却时间为K
  4. 则最短时间为 (n-1) * (k + 1) + m
  5. 此时只需要判断是公式推导的数量大还是任务长度的数量大,返回最大的值即可
var leastInterval = function(tasks, n) {
  const freq = _.countBy(tasks); // 获取每个字母出现的次数
  const maxAppearNum = Math.max(...Object.values(freq)); // 获取出现最多字母的次数
  let maxCount = 0; // 如果出现相同的字母,则同为最大值,则记录。
  Object.values(freq).forEach(num => {
    if (num === maxAppearNum) maxCount++; // 相同数量则加1
  })
  return Math.max((maxAppearNum - 1) * (n + 1) + maxCount, tasks.length); // 返回最大值即可
};