leetcode 任务调度器 python3

news/2024/7/3 7:10:56

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

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

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

示例 :

输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
     在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。 
 

提示:

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

get()方法语法:

dict.get(key, default=None)
参数:key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值。
返回值:返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。

class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        l = len(tasks)
        if l < 1 :
            return l 
        
        tasks_map = dict()
        for i in tasks:
            tasks_map[i] = tasks_map.get(i,0)+1
        tasks_max = max(tasks_map.values())
        res = (tasks_max - 1) * (n + 1)
        for key in tasks_map.keys():
            if tasks_map[key] == tasks_max:
                res += 1
        return res if res >= l else  l

思路:

完成所有任务的最短时间取决于出现次数最多的任务数量
看下题目给出的例子

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

因为相同任务必须要有时间片为 n 的间隔,所以我们先把出现次数最多的任务 A 安排上(当然你也可以选择任务 B)。例子中 n = 2,那么任意两个任务 A 之间都必须间隔 2 个单位的时间:

A -> (单位时间) -> (单位时间) -> A -> (单位时间) -> (单位时间) -> A
中间间隔的单位时间可以用来安排别的任务,也可以处于“待命”状态。当然,为了使总任务时间最短,我们要尽可能地把单位时间分配给其他任务。现在把任务 B 安排上:

A -> B -> (单位时间) -> A -> B -> (单位时间) -> A -> B
很容易观察到,前面两个 A 任务一定会固定跟着 2 个单位时间的间隔。最后一个 A 之后是否还有任务跟随取决于是否存在与任务 A 出现次数相同的任务。

该例子的计算过程为:

(任务 A 出现的次数 - 1) * (n + 1) + (出现次数为 3 的任务个数),即:

(3 - 1) * (2 + 1) + 2 = 8
所以整体的解题步骤如下:

计算每个任务出现的次数
找出出现次数最多的任务,假设出现次数为 x
计算至少需要的时间 (x - 1) * (n + 1),记为 min_time
计算出现次数为 x 的任务总数 count,计算最终结果为 min_time + count
特殊情况
然而存在一种特殊情况,例如:

输入: tasks = ["A","A","A","B","B","B","C","C","D","D"], n = 2
输出: 10
执行顺序: A -> B -> C -> A -> B -> D -> A -> B -> C -> D

此时如果按照上述方法计算将得到结果为 8,比数组总长度 10 要小,应返回数组长度。

转载自:https://leetcode-cn.com/problems/task-scheduler/solution/python-xiang-jie-by-jalan/


http://www.niftyadmin.cn/n/4352415.html

相关文章

java 上传文件_上传下载文件接口测试

简介在做接口测试的过程中&#xff0c;我们会遇到需要处理文件上传和下载的情况&#xff0c;我们可以使用Jmeter来完成文件的上传下载处理&#xff0c;本文提供两个小示例来展示如何使用Jmeter完成文件上传和文件下载并保存的功能首先来看看普通的Http接口请求的过程&#xff1…

问题管理的重要性

一个人&#xff0c;碰上的问题越多&#xff0c;解决的问题越多&#xff1b;这个人才能进步的越快&#xff1b; 没有问题&#xff0c;那就是在原地踏步。 没有问题才是最大的问题。 转载于:https://www.cnblogs.com/feng9exe/p/6084098.html

python之路——封装、继承和多态

面向对象的三大特性&#xff1a;封装、继承和多态 继承 继承是一种创建新类的方式&#xff0c;在python中&#xff0c;新建的类可以继承一个或多个父类&#xff0c;父类又可称为基类或超类&#xff0c;新建的类称为派生类或子类 单继承和多继承 1 class ParentClass1: #定义父类…

Java字节码浅析(—)

明白Java代码是如何编译成字节码并在JVM上运行的非常重要&#xff0c;这有助于理解程序运行的时候究竟发生了些什么。理解这点不仅能搞清语言特性是如何实现的&#xff0c;并且在做方案讨论的时候能清楚相应的副作用及权衡利弊。 本文介绍了Java代码是如何编译成字节码并在JVM…

leetcode 字符串的排列 python3

给定两个字符串 s1 和 s2&#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。 换句话说&#xff0c;第一个字符串的排列之一是第二个字符串的子串。 示例1:输入: s1 "ab" s2 "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba").示…

python高级应用_Python高级应用程序设计任务

一、主题式网络爬虫设计方案(15分)1.主题式网络爬虫名称关于链家泉州本地租房信息的爬虫2.主题式网络爬虫爬取的内容与数据特征分析2.1爬取的内容租房类型&#xff0c;所属区县&#xff0c;详细地址&#xff0c;房屋面积&#xff0c;房屋朝向&#xff0c;房屋房型&#xff0c;房…

计划的定义与要素

要素&#xff1a;目标、时间、方案。 提出在未来一定时期内要达到的组织目标以及实现目标的方案途径。 http://wiki.mbalib.com/wiki/计划 可以把计划的内容简要地概括为八个方面&#xff0c;即&#xff1a; What(什么)——计划的目的、内容&#xff1b; Who&#xff08;谁&…

微信小程序 Array对象操作

转载于:https://www.cnblogs.com/liudabao123/p/8329642.html