LeetCode 621 任务调度器

解一:

看到题目的时候,第一个反应是动态规划,回溯好像都不太适用。所以思考自己的解法。想到的解法如下(参考了[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 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值