「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」
模拟法
模拟人最短时间将任务执行完成的过程;
下面是一步一步讲解:
首先统计每个任务需要执行的次数,将数据放在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
}
复制代码
任务桶
将任务放在桶里;
动态度
静态图
代码
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)
}
复制代码