新闻详情

新闻详情

首页 / 资讯中心 / 详情

【贪心-3】621.任务调度器

发布时间:2026/10/2 15:12:52来源:尧图网络
【贪心-3】621.任务调度器
题目描述给你一个用字符数组tasks表示的 CPU 需要执行的任务列表用字母 A 到 Z 表示以及一个冷却时间n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成但有一个限制两个相同种类的任务之间必须有长度为n的冷却时间。返回完成所有任务所需要的最短时间间隔。示例 1输入tasks [A,A,A,B,B,B], n 2输出8解释在完成任务 A 之后你必须等待两个间隔。对任务 B 来说也是一样。在第 3 个间隔A 和 B 都不能完成所以你需要待命。在第 4 个间隔由于已经经过了 2 个间隔你可以再次执行 A 任务。示例 2输入tasks [A,C,A,B,D,B], n 1输出6解释一种可能的序列是A - B - C - D - A - B。由于冷却间隔为 1你可以在完成另一个任务后重复执行这个任务。示例 3输入tasks [A,A,A,B,B,B], n 3输出10解释一种可能的序列为A - B - idle - idle - A - B - idle - idle - A - B。只有两种任务类型A 和 B需要被 3 个间隔分割。这导致重复执行这些任务的间隔当中有两次待命状态。解题思路方法一贪心核心思路出现次数最多的任务决定了总时间的下限。假设出现次数最多的任务为 A出现maxCount次A _ _ A _ _ AA 之间有maxCount - 1个间隔每个间隔长度至少为n总框架长度 (maxCount - 1) × (n 1) 1最后还要加上有多少个任务和 A 出现次数相同maxCountTasks它们需要排在最后一个 A 的后面。最终公式result max(总任务数, (maxCount - 1) × (n 1) maxCountTasks)为什么取 max如果任务很多冷却时间被其他任务填满不需要待命总时间就是任务总数如果任务少冷却时间填不满需要待命总时间由公式计算具体过程示例tasks [A,A,A,B,B,B], n 2A 出现 3 次B 出现 3 次 maxCount 3, maxCountTasks 2A 和 B 都是 3 次 框架: A _ _ A _ _ A 公式: (3-1) × (21) 2 6 2 8 总任务数 6 result max(6, 8) 8 ✅tasks [A,A,A,B,B,B,C,C,D,D], n 2A 出现 3 次B 出现 3 次 maxCount 3, maxCountTasks 2A 和 B 公式: (3-1) × (21) 2 8 总任务数 10 result max(10, 8) 10 ✅代码实现class Solution { public: int leastInterval(vectorchar tasks, int n) { // 统计每个任务的出现次数 vectorint count(26, 0); for (char task : tasks) { count[task - A]; } // 找最大出现次数 int maxCount 0; for (int c : count) { maxCount max(maxCount, c); } // 统计有多少个任务出现次数等于 maxCount int maxCountTasks 0; for (int c : count) { if (c maxCount) maxCountTasks; } // 公式计算 int formula (maxCount - 1) * (n 1) maxCountTasks; return max((int)tasks.size(), formula); } };复杂度分析维度复杂度说明时间复杂度O(n)遍历 tasks 一次 遍历 26 个字母空间复杂度O(1)固定大小 26 的数组n 是任务数量。关键细节1. 为什么公式是(maxCount - 1) × (n 1) maxCountTasksmaxCount - 1最大出现次数任务之间的间隔数n 1每个间隔加上任务本身占用的位置 maxCountTasks最后一个间隔后面还有maxCountTasks个任务2. 为什么取max(tasks.size(), formula)如果任务很多冷却时间被填满总时间 任务总数如果任务少需要待命总时间 公式计算值3. 为什么不用模拟模拟需要 O(总时间) 时间而总时间可能很大。公式法 O(n) 更高效。方法二优先队列思路用大根堆维护剩余任务数每轮取前 n1 个任务执行。代码实现class Solution { public: int leastInterval(vectorchar tasks, int n) { vectorint count(26, 0); for (char task : tasks) count[task - A]; priority_queueint pq; for (int c : count) { if (c 0) pq.push(c); } int time 0; while (!pq.empty()) { vectorint temp; int cycle n 1; while (cycle 0 !pq.empty()) { int cnt pq.top(); pq.pop(); if (cnt 1) temp.push_back(cnt - 1); cycle--; time; } for (int cnt : temp) pq.push(cnt); // 如果堆不为空说明还需要待命 if (!pq.empty()) { time cycle; // 待命时间 } } return time; } };复杂度时间 O(总时间 × log 26)空间 O(26)缺点总时间可能很大不如公式法高效。两种方法对比方法时间复杂度空间复杂度推荐度贪心 数学公式O(n)O(1)⭐⭐⭐⭐⭐优先队列模拟O(总时间 × log 26)O(26)⭐⭐⭐总结要点说明核心思想最大出现次数决定下限取公式和任务总数的较大值关键公式(maxCount - 1) × (n 1) maxCountTasks时间复杂度O(n)空间复杂度O(1)
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI工程实战:从零构建大模型应用的完整路线图 2026/10/2 16:05:53

AI工程实战:从零构建大模型应用的完整路线图

1. “AI 工程”究竟在工程什么:一个从业者的重新定义1.1 先放下一个执念:AI 工程不等于训练模型很多人一听到“AI 工程”,第一反应是机器学习、深度学习、炼丹调参。这个印象在五年前是对的,在今天已经严重过时。自从基础大模型把…

阅读更多 →
本地优先AI桌面工作区:文档、表格、智能体与工作流一体化实践 2026/10/2 16:05:53

本地优先AI桌面工作区:文档、表格、智能体与工作流一体化实践

如果你手头同时管着几十份文档、一堆Excel表格,还要让AI按规则跑批处理任务,一定体会过那种“四处搬砖”的崩溃:文档躺在文件夹里,表格数据散落各处,AI Agent只能在终端里裸奔,工作流则被困在某协作平台上。…

阅读更多 →
从零开始学AI工程:提示词、RAG、Agent与部署的完整实践路线 2026/10/2 16:05:53

从零开始学AI工程:提示词、RAG、Agent与部署的完整实践路线

很多人问我,一个没接触过大模型开发的人,怎么系统进入AI工程(AI Engineering)。网上资料虽然多,但今天一个LangChain教程、明天一篇Agent论文、后天一个RAG实战,学完还是不知道怎么搭一个真正能上线的系统。…

阅读更多 →
GB2312/GBK字库寻址与编码转换实战:从点阵字模到SPI Flash 2026/10/2 16:05:47

GB2312/GBK字库寻址与编码转换实战:从点阵字模到SPI Flash

做嵌入式显示、折腾老系统的朋友,一定绕不开GBK/GB2312字库寻址这几个字。点阵屏、段码屏、低成本单片机、老式后台管理界面,凡是涉及中文字符显示,底层都要跟“汉字编码”和“字模偏移”打交道。很多时候你拿到一份HZK16或者GBK字库&#xf…

阅读更多 →
领域驱动设计官方示例代码落地指南:聚合边界与最小闭环实战 2026/10/2 16:05:47

领域驱动设计官方示例代码落地指南:聚合边界与最小闭环实战

简介:这份资源是领域驱动设计(DDD)的官方示例代码,面向希望深入理解 DDD 方法论并落地实践的 Java 开发者与架构学习者。它以船运业务为背景,将领域模型、聚合、实体与值对象、领域事件、领域服务、边界上下文、战略模…

阅读更多 →
软件开发模型全解析:十种主流模式与项目选型实战指南 2026/10/2 16:05:47

软件开发模型全解析:十种主流模式与项目选型实战指南

做项目管理和技术决策这么多年,我越来越觉得“软件开发模型”不是教科书里那些只能应付考试的概念,而是每个团队在开工前都该认真想清楚的一件事。模型选对了,需求变更、进度失控、质量翻车这些问题虽然不会消失,但至少你手里有了…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉