首页 > 其他分享 >【NO.98】LeetCode HOT 100—621. 任务调度器

【NO.98】LeetCode HOT 100—621. 任务调度器

时间:2023-10-31 11:02:57浏览次数:38  
标签:621 tasks temp int 任务 预占 HOT 长度 任务调度


题目:621. 任务调度器

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。

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

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

示例 1:

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

示例 2:

输入:tasks = [“A”,“A”,“A”,“B”,“B”,“B”], n = 0
输出:6
解释:在这种情况下,任何大小为 6 的排列都可以满足要求,因为 n = 0
[“A”,“A”,“A”,“B”,“B”,“B”]
[“A”,“B”,“A”,“B”,“A”,“B”]
[“B”,“B”,“B”,“A”,“A”,“A”]

诸如此类

示例 3:

输入:tasks = [“A”,“A”,“A”,“A”,“A”,“A”,“B”,“C”,“D”,“E”,“F”,“G”], n = 2
输出:16
解释:一种可能的解决方案是:
A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A

提示:

1 <= task.length <= 104

tasks[i] 是大写英文字母

n 的取值范围为 [0, 100]

解题


方式:贪心

这道题利用贪心的特性,利用题意的特点,找到长度的计算公式,文字描述说可能不太容易说清,可以直接看代码和相关注释。

/**
 * 时间复杂度:O(n)
 * 空间复杂度:O(1),所用空间是固定大小
 */
public int leastInterval(char[] tasks, int n) {
    // 求最短时间,而每个任务都是1单位时间,所以可以按要求把字符串排列
    // 符合题意的最短字符串的长度就是所求时间

    // 先统计每个任务出现的次数,找到出现次数最多的任务,记作A
    // 大写字母A~Z的ASCII代码是65~91,长度为26
    int[] temp = new int[26];
    for (int i = 0; i < tasks.length; i++) {
        temp[tasks[i] - 'A']++;
    }
    // 排序是为了找到次数最大值,当然也可以在上面遍历过程中,记录次数最大值
    Arrays.sort(temp);

    // 因为相同元素必须有n个冷却时间,假设A出现3次,n = 2,任务要执行完,至少形成AXX AXX A序列(X看作预占位置)
    // 该序列长度为 (每段字符串长度*(A出现的次数-1 即完整的A开头的段数) 加上最后一个A)
    int minLen = (n+1) * (temp[25] - 1) + 1;

    // 填充X位置:
    //此时为了尽量利用X所预占的空间(贪心)使得整个执行序列长度尽量小,将剩余任务往X预占的空间插入
    //剩余的任务次数有两种情况:
    //1.与A出现次数相同,比如B任务最优插入结果是ABX ABX AB,中间还剩两个空位,当前序列长度+1
      //2.比A出现次数少,若还有X,则按序插入X位置,比如C出现两次,形成ABC ABC AB的序列
      //直到X预占位置还没插满,剩余元素逐个放入X位置就满足冷却时间至少为minLen
      // 注意:temp数组下标范围为0-25,25为数量最多的(因为我们升序排序了),也就是上面例子中的A,填充X位置,应该从倒数第二个开始,也就是24
      for (int i = 24; i >= 0; i--) {
          if (temp[i] == temp[25]) {
              // 如果这个字符出现的次数也是最多的,那根据上面分析,序列长度要+1
              minLen++;
          }
      }

      //当所有X预占的位置插满了怎么办?
      //在任意插满区间(这里是ABC)后面按序插入剩余元素,比如ABCD ABCD发现D之间距离至少为n+1,肯定满足冷却条件
      //因此,当X预占位置能插满时,最短序列长度就是task.length,不能插满则取最少预占序列长度
      return Math.max(minLen, tasks.length);

  }


标签:621,tasks,temp,int,任务,预占,HOT,长度,任务调度
From: https://blog.51cto.com/u_15714244/8102520

相关文章

  • 【NO.99】LeetCode HOT 100—647. 回文子串
    题目:647.回文子串给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例1:输入:s=“......
  • 【NO.100】LeetCode HOT 100—739. 每日温度
    题目:739.每日温度给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。示例1:输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,2,1,1......
  • 快照snapshot
    快照snapshot快照功能通常是以写入时复制技术来实作。Linux通过逻辑卷轴管理员实作快照功能。写入时复制写入时复制(英语:Copy-on-write,简称COW)是一种计算机[程序设计]领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获......
  • Photoshop 2020 中文免费版下载含安装包
    AdobePhotoshopCC中文版除去PhotoshopCS6中所包涵的功能,PhotoshopCC还新增相机防抖动、CameraRAW功能改进、图像提升采样、属性面板改进、Behance集成等等功能。adobephotoshopcc2020拥有智能型锐利化、智能型增加取样、3D场景面板、建立晕映效果、修图、水印、羽化等等功......
  • Java Hotspot G1 GC 原理
    目录原理概念初始堆占用情况标记RememberSet原理CardTableCollectSet停顿预测模型G1的垃圾回收过程对象分配线程本地分配缓冲区Eden区中分配Humongous区分配堆内存结构传统的GC收集器G1收集器G1垃圾收集周期YoungGCYoungGC总结MixedGC全局并发标记初始标记根区域扫描......
  • Adobe_Photoshop_2024_25.0.0.37图文安装教程及下载
    Adobe_Photoshop_2024正式版,拥有之前beta版本的全部功能,包括但不限于内置AI绘图,一键抠图、移除工具、悬浮工具栏、图像扩展、填充式生成、调整预设等等。尤其是“生成式填充”和“生成式扩展”。除此之外,PS2024正式版还内置了NeuralFilters神经AI滤镜,这款插件用于图片的处理,它......
  • 新手教程系列:照片传输、整理、分享,Synology Photos一套轻松搞定
    谁说简单易用一定要牺牲安全?SynologyPhotos可让您轻松分享充满回忆的相册,同时确保相册安全,无论是分享一张照片,还是一个视频或者整个相册,群晖都能满足您的需求,它可不仅限去共享照片功能,还有传输,收集,整理,堪比摄影小助理,所以今天就来盘一盘如何让 SynologyPhotos成为你的摄影助理......
  • photon rust 图像处理库
    photon是一个基于rust开发的图像处理库,同时也支持基于WebAssembly的处理参考nodejs使用添加依赖{"name":"image-demo","version":"1.0.0","main":"index.js","license":"MIT",......
  • 【论文阅读笔记】【SAM相关】 Matcher: Segment Anything with One Shot Using All-Pu
    读论文时思考的问题论文试图解决什么问题?如何更好地建立视觉方面的fundationmodel如何建立一个模型,使得其在没有人类输入信号的情况下(这里主要是one-shotimage)能更好地挖掘SAM的能力,实现相同的语义元素(好像不一定要求是一个实例)的分割(并提取割出来的物体的语义信息?)......
  • gerrit 快捷键说明 shotcuts 说明
    gerrit是一个git仓库,可以快速的对比代码的不同。下面记录一下快捷键NavigationwithinthereviewUIcanbecompletelydonebykeys,andmostactionscanbecontrolledbykeyboardshortcuts.Typing?opensapopupthatshowsalistofavailablekeyboardshortcu......