[LeetCode]621. 任务调度器(贪心)

题目

给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

然而,两个相同种类的任务之间必须有长度为?n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。

你需要计算完成所有任务所需要的最短时间。

示例 1:

输入: tasks = ["A","A","A","B","B","B"], n = 2
输出: 8
执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
注:

任务的总个数为?[1, 10000]。
n 的取值范围为 [0, 100]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/task-scheduler
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

1 只需找出出现次数最多的字符,假设其出现次数为maxOccurTimes,把它们间隔为n的放置,其余task(或空)补足间隔即可;易得字符数组长度为(maxOccurTimes - 1) * (n + 1) + 1; (贪心的思想)
2 但考虑出现次数等于最大次数的字符有多个为maxOccurKind,那么这几个字符排在字符数组末尾,字符数组长度应改为(maxOccurTimes - 1) * (n - 1) + maxOccurKind;
3 若上式结果<原字符数组长度,说明按上述方法间隔里排不下,那么应取原字符数组长度。
4 若最大次数的字符种数maxOccurKind>间隔数,那么在原字符数组长度一定可以排下,也应取原字符数组长度。

代码

public static int leastInterval(char[] tasks, int n) {
        if (tasks == null) {
            return 0;
        }

        HashMap<Character, Integer> occurTimesMap = new HashMap<>();
        for (char task : tasks) {
            occurTimesMap.merge(task, 1, Integer::sum);
        }

        int maxOccurTimes = 0;// 任务的最大次数
        int maxOccurKind = 0;// 次数等于最大次数的任务数
        for (int occurTimes : occurTimesMap.values()) {
            if (occurTimes > maxOccurTimes) {
                maxOccurTimes = occurTimes;
                maxOccurKind = 1;
            } else if (occurTimes == maxOccurTimes) {
                maxOccurKind++;
            }
        }

        if (maxOccurKind > maxOccurTimes) {
            return tasks.length;
        }

        return Math.max((maxOccurTimes - 1) * (n + 1) + maxOccurKind, tasks.length);
    }

原文地址:https://www.cnblogs.com/coding-gaga/p/11719252.html

时间: 2024-10-11 10:23:25

[LeetCode]621. 任务调度器(贪心)的相关文章

《CLR via C#》之线程处理——任务调度器

<CLR via C#>之线程基础--任务调度器 <CLR via C#>之线程基础--任务调度器线程池任务调度器设置线程池限制如何管理工作者线程同步上下文任务调度器自定义TaskScheduler派生类 FCL提供了两个派生子TaskScheduler的类型:线程池任务调度器(thread pool task scheduler),和同步上下文任务调度器(synchronization context task scheduler).默认情况下都使用线程池任务调度器. 线程池任务

TaskScheduler一个.NET版任务调度器

TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式满足日历形式的复杂触发规则: 支持动态添加和删除任务,可根据具体需求实现复杂逻辑: static void Main(string[] args) { Scheduler scheduler = new Scheduler(); SimpleTrigger simpleTrigger = new S

SST-超级简单任务调度器结构分析

SST(Super Simple Task) 是一个基于任务优先级.抢占式.事件驱动.RTC.单堆栈的超级简单任务调度器,它基于Rober Ward一篇论文的思想,Miro Samek用C重新编程实现的,它是QP中QK的的基本思想. QK加上状态机事件处理的方法QEP,再加上任务的注册与事件的保存与分发功能QF,再加上串口调试功能QSpy,再加上基于模型驱动的开发QM,就成了QP. 2015年,QP获得“嵌入式计算设计”顶级发明奖[1]. 1.SST层次结构 ? 2.SST总体结构 ? 发送事件

温故知新 任务调度器(定时器)

1,导入Quartz的依赖包 2,任务调度主要是三个关键点:调度器    任务    触发器 Schedule  Job   Strigger //创建任务类 1,实现Job接口 2,任务的自定义执行方法(重写) //创建调度器 ScheduleFactory scheduleFactory =new StdScheduleFactory(); Schedule schedule=scheduleFactory.getSchedule(); //创建任务 JobDetail jobDetail=

[leetcode]621. Task Scheduler任务调度

Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU cou

任务调度器quartz的使用

1.quartz的获取. 可參照:Quartz任务调度模型实例 2.开发思路: 要使用定时器quartz.先弄清楚三个概念:调度器.任务.触发器.开发也是依照这三个方面来开发, 1>写一个Job的实现类.里面是你自己要完毕的业务逻辑: 2>写Trigger的实现类,主要有SimpleTrigger和CronTrigger这两个子类.来决定调度方案: 当仅需触发一次或者以固定时间间隔周期运行,SimpleTrigger是最适合的选择: 而CronTrigger则能够通过Cron表达式定义出各种复

[LeetCode] Jump Game II 贪心

Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to reach the last index in the minimum number of jumps

Quartz任务调度器

背景:              近期项目中遇到跨区调拨商品的需求,比如A区和B区,需要判断A区或者B区某种sku是否需要从对方库调拨商品来补充货源,避免因缺失商品而出现订单延误,影响销售和对用户产生不良影响. 问题:             数据量庞大,如果当查看的时候去获取数据,那么会严重影响系统的性能,甚至导致数据库和应用服务器无法响应. 解决方案:            规定在某个时间点,最好是在晚上12点时系统自动获取需要调拨的数据,然后将数据存储到数据库中.晚上12点,用户访问量和系

SpringQuartz定时任务调度器

JAVA代码测试类 public class TestQuartz { public void test(){ System.out.println("*********************Quartz的任务调度*********************"); } } Quartz配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www