任务调度器

解题思路:

  1. 第一种情况:

    • 设计桶的大小为 n+1,则相同的任务恰好不能放入同一个桶(一行为一个桶),最密也只能放入相邻的桶;
    • 对于重复的任务,只能将每个都放入不同的桶中,因此桶的个数就是重复次数最多的任务的个数;
    • 一个桶不管是否放满,其占用的时间均为 n+1,这是因为后面桶里的任务需要等待冷却时间;
    • 最后一个桶是个特例,由于其后没有其他任务需等待,所以占用的时间为桶中的任务个数;
    • 最终我们得到:总排队时间 = (桶个数 - 1) * (n + 1) + 最后一桶的任务数
  2. 第二种情况:

    • 当任务重复率很低时,计算得到的桶个数很少;
    • 但由于任务很多,可能出现桶不够用的情况,此时可以假想原来的桶被加长了,且所有的桶均装满,因此任务的总等待时间即为任务的总个数;
    • 则对第一种情况和第二种情况的结果取最大值即可;

图解:

复杂度:

  1. 时间复杂度:O(n);

  2. 空间复杂度:O(1);

代码实现:

var leastInterval = function (tasks, n) {
  let arr = new Array(26).fill(0)
  for (let t of tasks) {
    //统计各个字母出现的次数
    arr[t.charCodeAt() - 'A'.charCodeAt()]++
  }

  // 找到最大次数
  let max = Math.max(...arr)

  // 计算前n-1行n的间隔的时间大小
  let ret = (max - 1) * (n + 1)
  // 获取最后一桶的任务数
  for (let i = 0; i < 26; i++) {
    if (arr[i] === max) {
      ret++
    }
  }

  // 取最大值
  return Math.max(ret, tasks.length)
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 任务调度器
  2. 2. 解题思路:
  3. 3. 图解:
  4. 4. 复杂度:
  5. 5. 代码实现: