[路飞]_今夜搞调度任务器

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

621. 任务调度器

模拟法

模拟人最短时间将任务执行完成的过程;

下面是一步一步讲解:

首先统计每个任务需要执行的次数,将数据放在list中;

  let list = Array(26).fill(0)
  for (let i = 0; i < len; i++) {
    const idx = tasks[i].charCodeAt() - 'A'.charCodeAt()
    list[idx] += 1
  }
复制代码

第1步:将执行次数为0的任务移除

list = list.filter((v) => v > 0)
复制代码

第3步:list长度为0,所有任务执行完毕;

while (list.length) {
// 执行任务,未执行任务数量-1;

// 移除任务需要执行次数为0的任务
 list = list.filter((v) => v > 0)
}
复制代码

第4步:分类讨论执行任务

当未执行任务数量小于冷却时间n; 每个任务执行一次,相应任务未执行次数-1

当未执行任务数量大于冷却时间n; 任务下标小于n的任务执行一次;相应任务未执行次数-1

边界处理

当最后一次执行任务时,不需要将冷却时间计入总时间;

将list排序后再次进入循环,直至list任务数量为0

 if (l < n) {
      list = list.map((v) => v - 1)
    } else {
      list = list.map((v, i) => (i <= n ? v - 1 : v))
      list.sort((a, b) => b - a)
    }
复制代码
var leastInterval = function (tasks, n) {
  const len = tasks.length
  if (n === 0) return len
  let list = Array(26).fill(0)
  for (let i = 0; i < len; i++) {
    const idx = tasks[i].charCodeAt() - 'A'.charCodeAt()
    list[idx] += 1
  }

  list = list.filter((v) => v > 0)
  let result = 0
  while (list.length) {
    const l = list.length
    if (l < n) {
      list = list.map((v) => v - 1)
    } else {
      list = list.map((v, i) => (i <= n ? v - 1 : v))
      list.sort((a, b) => b - a)
    }

    list = list.filter((v) => v > 0)
    if (list.length === 0) {
      return result + l
    }
    result += n + 1
  }
  return result
}
复制代码

任务桶

将任务放在桶里;

动态度

111.gif

静态图

未命名.001.jpeg

未命名.002.jpeg

未命名.003.jpeg

未命名.004.jpeg

代码

var leastInterval = function (tasks, n) {
  const len = tasks.length
  if (n === 0) return len
  let list = Array(26).fill(0)

  let max = 0
  for (let i = 0; i < len; i++) {
    const idx = tasks[i].charCodeAt() - 'A'.charCodeAt()
    list[idx] += 1
    max = Math.max(max, list[idx])
  }
  list = list.filter((v) => v > 0)
  const maxNum = list.filter((v) => v === max)
  const t1 = (max - 1) * (n + 1) + maxNum.length
  return Math.max(len, t1)
}
复制代码

猜你喜欢

转载自juejin.im/post/7036002332361883679