LeetCode: 621. 任务调度器
题目与上题相同
博客指路; 621. 任务调度器 (优先队列模拟)
题目大意:
给定一定数量的不同执行次数的任务, 相同任务执行完后会有 n 个时间的冷却时间。
求最少执行完任务的时间。
构造
最后得到的公式(冷却时间大于任务数量时): ( m a x E x c u − 1 ) ∗ ( n + 1 ) + m a x C o u n t (maxExcu - 1) * (n + 1) + maxCount (maxExcu−1)∗(n+1)+maxCount
冷却时间少于任务数量的时候: len(tasks)
( m a x E x c u − 1 ) ∗ ( n + 1 ) (maxExcu - 1) * (n + 1) (maxExcu−1)∗(n+1) 每个填入, 周期大于任务数量的时候,每次填入一个需要这么多的时间。直到填完最多的执行次数的任务。
处理最后一行
+ m a x C o u n t +maxCount +maxCount 是最后填入周期 n + 1 的空格时, 最后剩下的就是填入这 maxCount 个数
所以最后就是两者取最大值.
根据理解
公式就可以换为
计算上最多执行次数的的任务与周期的需要的完成时间 (最后一行算多了 >> 不一定需要 n + 1 的时间 >> 最后一行只要最多执行次数的任务的数量即可 maxCount )
所以减去多加的 ( n + 1 − m a x C o u n t ) (n + 1 - maxCount) (n+1−maxCount)
( m a x E x c u ) ∗ ( n + 1 ) ) − ( n + 1 − m a x C o u n t ) (maxExcu)*(n+1)) - (n + 1 - maxCount) (maxExcu)∗(n+1))−(n+1−maxCount)
构造
func leastInterval(tasks []byte, n int) int {
cnt := map[byte]int{}
for _, c := range tasks{
cnt[c]++;
}
// maxExcu 最多的执行次数
// maxCount 与最多执行次数相同的任务数量
maxExcu, maxCount := 0, 0
for _, val := range cnt {
if val > maxExcu{
maxExcu, maxCount = val, 1
} else if val == maxExcu{
maxCount++
}
}
return int(math.Max(float64(((maxExcu-1)*(n+1))+maxCount), float64(len(tasks))))
//return int(math.Max(float64(((maxExcu)*(n+1)) - (n + 1 - maxCount)), float64(len(tasks))))
}
LeetCode构造题解: 任务调度器