Leetcode 621

Leetcode 621, Task Scheduler

题目描述:有A-Z种任务,每个任务有i个,规定在同一种任务必须间隔n个以上,求最小的执行时间。
思路:先求出每一种任务各有多少个,然后排序,将最多的取出来,留下n个空间,然后把剩下的比它少的插进去,如果所有的间隔都插满了,那么执行时间间隔就是任务的总数,这里的间隔即时插满了,如果还有任务未填充,依旧可以填充到尾部不算溢出,因为题目只要求间隔n个以上,如果没有插满,说明还有间隔,就需要计算需要的时间,比如一共有m种相同的任务,需要n个间隔,那么除去最后一种执行完了就可以不需要添加间隔,前面的n-1个每一个都需要(k+1)个执行时间,所以总时间是(n-1)(k+1),但是最多的任务并不只有一种有m种每种n个的时候,每一种的前面n-1个都已经放好了,只有最后面的一个不需要间隔直接执行,所以这种情况下总时间为 (n-1) (k+1) + m,如果间隔被填满了那么总时间就是数组长度,如果没有那就是以上计算结果。

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        int res[26] = {0};
        for(int i = 0; i < tasks.size(); i++) 
            res[tasks[i] - 'A']++;
        sort(res, res+26);
        int ans = (res[25] - 1) * (n + 1);
        for(int i = 25; i >= 0 && res[i] == res[25]; i--) 
            ans++;
        return max(ans, (int)tasks.size());
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值