解一:
看到题目的时候,第一个反应是动态规划,回溯好像都不太适用。所以思考自己的解法。想到的解法如下(参考了[LeetCode] Task Scheduler 任务行程表 - Grandyang - 博客园 (cnblogs.com)):
维护一个哈希表mp,mp中存储各个任务对应的待完成任务数。遍历tasks数组,再这一过程中计数出现次数最多的任务的出现次数maxJobTime,以及出现次数为maxJobTime的不同任务的个数maxJobNum(例如,A和B出现次数均为3,均为出现次数最多的字母,那么maxJobTime=3,maxJobNum=2)。
根据maxJobTime与maxJobNum考虑参考内容([LeetCode] Task Scheduler 任务行程表 - Grandyang - 博客园 (cnblogs.com))中的分组思想。
1、每一组的长度为 n+1和 maxJobNum中较大的值,res为所求最短时间
1)当组长度为 n+1:res = (n+1)*(maxJobTime-1)+maxJobNum
2)当组长度为 maxJobNum:res = maxJobNum*maxJobTime
注意:存在一种情况,各个组的空隙被填满,但还有剩余的任务没有执行,因此最后的返回值应为res 以及 len(tasks) 中的较大值。
func leastInterval(tasks []byte, n int) int {
if n==0{ return len(tasks) }
var mp map[byte]int=make(map[byte]int)
var maxJobTime, maxJobNum int=0, 0
for _, v:=range tasks{
mp[v]++
if maxJobTime<mp[v] {
maxJobTime++
maxJobNum=1
}else if maxJobTime==mp[v] {
maxJobNum++
}
}
slotLen:=n+1-maxJobNum // 每一组剩余空隙长度
res:=0
if slotLen>=0{
res=(n+1)*(maxJobTime-1)+maxJobNum
}else{
res=maxJobNum*maxJobTime
}
return getMax(len(tasks), res)
}
func getMax(a, b int) int {
if a>=b{
return a
}else{ return b }
}