首页 > 其他分享 >Leetcode621. 任务调度器

Leetcode621. 任务调度器

时间:2024-05-29 09:00:47浏览次数:25  
标签:Leetcode621 cnt tasks int mxCnt 任务 任务调度 mx

Every day a Leetcode

题目来源:621. 任务调度器

类似题目:1953. 你可以工作的最大周数

解法1:贪心

本质上来说,我们需要构造一个尽量短的,相同元素间隔 >= (n+1) 的序列。

用一个数组 cnt 统计每个任务的次数。设 cnt 的元素和为 s,这是任务总数,也是序列长度的下界。

当存在多个任务时,由于每一类任务都需要被完成,因此本质上我们最需要考虑的是将数量最大的任务安排掉,其他任务则是间插其中。设 mx=max⁡(cnt),共有 mxCnt 个任务数为 mx 的任务。我们可以把该任务的阶段任务每次间隔 n 位排列在序列中,其他的任务则安排在空位上,这样的构造方法能保证序列最短。

假设 mx = 4,mxCnt = 3,n = 4,安排情况如下所示:

在这里插入图片描述

构造方法是:前面 (mx - 1) 行,每行 (n + 1) 个元素,最后加上 mxCnt 个元素,序列的长度为 (mx - 1) * (n + 1) + mxCnt。

当 s <= (mx - 1) * (n + 1) + mxCnt 时,我们总能将其他任务插到空闲时间中去,不会引入额外的冻结时间;否则,我们就要在序列中插入空位。

综上,答案是 s 和 (mx - 1) * (n + 1) + mxCnt 的较大值,即 max(s, (n + 1) * (mx - 1) + mxCnt)。

代码:

/*
 * @lc app=leetcode.cn id=621 lang=cpp
 *
 * [621] 任务调度器
 */

// @lc code=start
class Solution
{
public:
    int leastInterval(vector<char> &tasks, int n)
    {
        vector<int> cnt(26, 0);
        for (char &task : tasks)
            cnt[task - 'A']++;

        int mx = *max_element(cnt.begin(), cnt.end());
        int s = 0, mxCnt = 0;
        for (int &c : cnt)
        {
            s += c;
            if (c == mx)
                mxCnt++;
        }

        return max(s, (n + 1) * (mx - 1) + mxCnt);
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n+|∑|),其中 n 是数组 tasks 的长度,∑ 是字符集,因为数组 tasks 全是大写英文字母,所以 |∑| = 26。

空间复杂度:O(|∑|),其中 ∑ 是字符集,因为数组 tasks 全是大写英文字母,所以 |∑| = 26。

标签:Leetcode621,cnt,tasks,int,mxCnt,任务,任务调度,mx
From: https://blog.csdn.net/ProgramNovice/article/details/138946194

相关文章

  • 分布式任务调度内的 MySQL 分页查询优化
    作者:vivo互联网数据库团队- QiuXinbo本文主要通过图示介绍了用主键进行分片查询的过程,介绍了主键分页查询存在SQL性能问题,如何去创建高效的索引去优化主键分页查询的SQL性能问题。对于数据分布不均如何发现,提供了一些SQL查询案例来进行参考,对MySQLIndexConditionPushdown......
  • 分布式任务调度内的 MySQL 分页查询优化 等值在前,排序在中间,范围在最后
    分布式任务调度内的MySQL分页查询优化https://mp.weixin.qq.com/s/VhSzxYIRv83T3D3JD4cORg三、优化方案 3.1优化方案确定 当前SQL执行计划以主键进行顺序遍历,是一个范围扫描,有点像在一片很大的居民区按照序号挨家挨户寻找一些特定的人一样,比较简单也比较低效。 既然......
  • kettle从入门到精通 第六十一课 ETL之kettle 任务调度器,轻松使用xxl-job调用kettle中
    1、大家都知道kettle设计的job流程文件有个缺点:只能设置简单的定时任务,无法设置复杂的如支持cron表达式的job。 今天给大家分享一个使用xxl-job调度carte的流程文件的示例。整个调度流程图如下: 1)xxl-job-admin,页面可视化配置任务。2)xxl-job-executor,job执行器,通过调用carte......
  • Springcloud学习笔记67--springboot 整合 任务调度框架Quartz
    1.背景定时任务Job的作业类中无法注入Service等由Spring容器所管理的Bean。例如下面这种情况,TaskCronJobService就无法成功注入。importjava.util.Iterator;importjavax.annotation.Resource;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importor......
  • 自己动手实现一个轻量无负担的任务调度ScheduleTask
    至于任务调度这个基础功能,重要性不言而喻,大多数业务系统都会用到,世面上有很多成熟的三方库比如Quartz,Hangfire,Coravel这里我们不讨论三方的库如何使用而是从0开始自己制作一个简易的任务调度技术栈用到了:BackgroundService和NCrontab库第一步我们定义一个简单的任务约定......
  • 从0到1,百亿级任务调度平台的架构与实现
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • Cron表达式-任务调度
    当我们谈论任务调度时,cron(Cron表达式)是一种非常常见和常用的方式。它是一种用于在特定时间间隔内定期执行任务的调度表达式。cron表达式由6个字段组成,分别代表分钟、小时、日期、月份、星期几和要执行的命令或脚本。下面是cron表达式的每个字段的含义:09***command分钟(0-5......
  • 在Linux中,如何使用cron进行任务调度?
    Cron是Linux系统中用于任务调度的一个强大工具,它允许用户安排命令或脚本在特定的时间周期性地自动执行,无需用户干预。Cron作业可以按分钟、小时、日期、月份、星期几来设置执行时间。以下是使用cron进行任务调度的基本步骤:1.编辑Crontab文件Crontab(crontable)文件包含了所有计......
  • 速度围观|使用分布式企业级任务调度平台,到底有多香?
    任务调度平台是关键的软件基础设施,专门设计用于自动化、高效和可靠地安排及执行预定的后台任务。谷歌云首席决策工程师KasimKhan曾提到:“在云计算环境中,自动化和效率是关键。”任务调度平台通过优化资源使用和集中管理功能,提供了一系列强大的调度策略、执行管理、监控报警和开发......
  • .NET有哪些好用的定时任务调度框架
    .NET有哪些好用的定时任务调度框架前言定时任务调度的相关业务在日常工作开发中是一个十分常见的需求,经常有小伙伴们在技术群提问:有什么好用的定时任务调度框架推荐的?今天大姚给大家分享5个.NET开源、简单、易用、免费的任务调度框架,帮助大家在做定时任务调度框架技术选型的时候......