Skip to content
js
/*
 * @lc app=leetcode.cn id=621 lang=javascript
 *
 * [621] 任务调度器
 */

// @lc code=start
/**
 * @param {character[]} tasks
 * @param {number} n
 * @return {number}
 */
var leastInterval = function (tasks, n) {
  const freq = _.countBy(tasks);

  // 任务总数
  const m = Object.keys(freq).length;
  const nextValid = new Array(m).fill(1);
  const rest = Object.values(freq);

  let time = 0;
  for (let i = 0; i < tasks.length; i++) {
    time++;
    let minNextValid = Number.MAX_VALUE;
    for (let j = 0; j < m; j++) {
      if (rest[j] > 0) {
        minNextValid = Math.min(nextValid[j], minNextValid);
      }
    }
    time = Math.max(time, minNextValid);

    let best = -1;
    for (let j = 0; j < m; j++) {
      if (rest[j] && nextValid[j] <= time) {
        if (best === -1 || rest[j] > rest[best]) {
          best = j;
        }
      }
    }

    nextValid[best] = time + n + 1;
    rest[best]--;
  }

  return time;
};

// @lc code=end

上次更新于: