621. 任务调度器 (构造)

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 (maxExcu1)(n+1)+maxCount


冷却时间少于任务数量的时候: len(tasks)



( m a x E x c u − 1 ) ∗ ( n + 1 ) (maxExcu - 1) * (n + 1) (maxExcu1)(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+1maxCount)

( 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+1maxCount)


构造

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构造题解: 任务调度器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值