【C++堆(优先队列)】1834. 单线程 CPU|1797

news2024/11/27 8:26:29

本文涉及知识点

C++堆(优先队列)

LeetCode1834. 单线程 CPU

给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。
现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:
如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。
如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。
一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。
CPU 可以在完成一项任务后,立即开始执行一项新任务。
返回 CPU 处理任务的顺序。
示例 1:
输入:tasks = [[1,2],[2,4],[3,2],[4,1]]
输出:[0,2,3,1]
解释:事件按下述流程运行:

  • time = 1 ,任务 0 进入任务队列,可执行任务项 = {0}
  • 同样在 time = 1 ,空闲状态的 CPU 开始执行任务 0 ,可执行任务项 = {}
  • time = 2 ,任务 1 进入任务队列,可执行任务项 = {1}
  • time = 3 ,任务 2 进入任务队列,可执行任务项 = {1, 2}
  • 同样在 time = 3 ,CPU 完成任务 0 并开始执行队列中用时最短的任务 2 ,可执行任务项 = {1}
  • time = 4 ,任务 3 进入任务队列,可执行任务项 = {1, 3}
  • time = 5 ,CPU 完成任务 2 并开始执行队列中用时最短的任务 3 ,可执行任务项 = {1}
  • time = 6 ,CPU 完成任务 3 并开始执行任务 1 ,可执行任务项 = {}
  • time = 10 ,CPU 完成任务 1 并进入空闲状态
    示例 2:
    输入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]
    输出:[4,3,2,0,1]
    解释:事件按下述流程运行:
  • time = 7 ,所有任务同时进入任务队列,可执行任务项 = {0,1,2,3,4}
  • 同样在 time = 7 ,空闲状态的 CPU 开始执行任务 4 ,可执行任务项 = {0,1,2,3}
  • time = 9 ,CPU 完成任务 4 并开始执行任务 3 ,可执行任务项 = {0,1,2}
  • time = 13 ,CPU 完成任务 3 并开始执行任务 2 ,可执行任务项 = {0,1}
  • time = 18 ,CPU 完成任务 2 并开始执行任务 0 ,可执行任务项 = {1}
  • time = 28 ,CPU 完成任务 0 并开始执行任务 1 ,可执行任务项 = {}
  • time = 40 ,CPU 完成任务 1 并进入空闲状态
    提示:
    tasks.length == n
    1 <= n <= 105
    1 <= enqueueTimei, processingTimei <= 109

堆(优先队列)

一,将tasks的下标indexs,按进入时间的顺序排序,进入时间相同,则处理时间短的在前面。
二,初始完成时间finish =-1。
三,将进入时间<=finish的任务放到小根堆中。堆元素包括:处理时间和下标。
四,如果小根堆为空,取第一个未执行的任务。如果没有未执行的任务,退出循环。
五,执行任务,并更新finish 为当前任务的完成时间。

代码

核心代码

class Solution {
		public:
			vector<int> getOrder(vector<vector<int>>& tasks) {
				const int N = tasks.size();
				vector<int> indexs(N);
				iota(indexs.begin(), indexs.end(), 0);
				sort(indexs.begin(), indexs.end(), [&](const int i1, const int i2) {
					if (tasks[i1] == tasks[i2]) { return i1 < i2; }
					return tasks[i1] < tasks[i2]; 
					});
				priority_queue<pair<int, int>, vector< pair<int, int>>, greater<>> minHeap;
				long long finish = -1;
				vector<int> ret;
				for (int i = 0; ;) {
					while ((i < indexs.size()) && (tasks[indexs[i]][0] <= finish)) {
						minHeap.emplace(tasks[indexs[i]][1], indexs[i]);
						i++;
					}
					if (minHeap.empty()) {
						if (i >= indexs.size()) { break; }//所有都已经处理
						minHeap.emplace(tasks[indexs[i]][1], indexs[i]);
						finish = tasks[indexs[i]][0];
						i++;
					}
					finish += minHeap.top().first;
					ret.emplace_back(minHeap.top().second);
					minHeap.pop();
				}
				return ret;
			}
		};

单元测试

vector<vector<int>> tasks;
		TEST_METHOD(TestMethod1)
		{
			tasks = { {7,1} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{0}, res);
		}
		TEST_METHOD(TestMethod2)
		{
			tasks = { {7,3},{9,2},{10,1} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{0,2,1}, res);
		}
		TEST_METHOD(TestMethod3)
		{
			tasks = { {7,2},{9,2},{10,1} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{0, 1,2}, res);
		}
		TEST_METHOD(TestMethod4)
		{
			tasks.assign(3, { 1'000'000'000,1'000'000'000 });
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{0, 1, 2}, res);
		}
		TEST_METHOD(TestMethod11)
		{
			tasks = { {1,2},{2,4},{3,2},{4,1} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{0, 2, 3, 1}, res);
		}
		TEST_METHOD(TestMethod12)
		{
			tasks = { {7,10},{7,12},{7,5},{7,4},{7,2} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{4, 3, 2, 0, 1}, res);
		}
		TEST_METHOD(TestMethod13)
		{
			tasks = { {19,13},{16,9},{21,10},{32,25},{37,4},{49,24},{2,15},{38,41},{37,34},{33,6},{45,4},{18,18},{46,39},{12,24} };
			auto res = Solution().getOrder(tasks);
			AssertEx(vector<int>{6, 1, 2, 9, 4, 10, 0, 11, 5, 13, 3, 8, 12, 7}, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QStandardItemModel的role

QStandardItemModel定义了一些标准的角色&#xff0c;而QAbstractItemModel允许自定义角色。以下是一些常见的数据角色&#xff1a;1. **Qt::DisplayRole**&#xff1a;这是最基本的角色&#xff0c;用于显示在视图中的文本。当一个单元格被绘制时&#xff0c;通常会查询这个角…

Go 语言应用开发:从入门到实战

Go 语言应用开发&#xff1a;从入门到实战 引言 Go&#xff08;Golang&#xff09;是由 Google 开发的一种开源编程语言&#xff0c;设计初衷是提高编程效率&#xff0c;尤其是在高并发场景下表现出色。Go 语言以其简洁、易学、高效并发的特性&#xff0c;逐渐成为开发者的首…

<Project-8.1.1 pdf2tx-mm> Python 调用 ChatGPT API 翻译PDF内容 历程心得

原因 用ZhipuAI&#xff0c;测试用的PDF里&#xff0c;有国名西部省穆斯林&#xff0c;翻译结果返回 “系统检测到输入或生成内容可能包含不安全或敏感内容&#xff0c;请您避免输入易产生敏感内容的提 示语&#xff0c;感谢您的配合” 。想过先替换掉省名、民族名等&#xff…

DM8数据库用户和表空间管理

1 说明 DM8用户管理和表空间管理常用的管理命令&#xff0c;包括创建、修改和查看信息操作等。 2 用户管理 2.1 创建用户 创建一个用户lu9up&#xff0c;密码为"admin2024."&#xff0c;未制定表空间&#xff0c;使用默认的表空间main。 SQL> create user lu…

银河麒麟桌面操作系统V10:解决激活时“无法获取硬件信息(错误码#0017)”问题

银河麒麟桌面操作系统V10&#xff1a;解决激活时“无法获取硬件信息&#xff08;错误码#0017&#xff09;”问题 1、问题描述2、问题解决方法步骤一&#xff1a;打开终端步骤二&#xff1a;删除/etc/.kyhwid文件步骤三&#xff1a;重新激活系统总结 &#x1f490;The Begin&…

【Ubuntu】在Ubuntu上安装IDEA

【Ubuntu】在Ubuntu上安装IDEA 零、前言 最近换了Ubuntu系统&#xff0c;但是还得是要写代码&#xff0c;这样就不可避免地用到IDEA&#xff0c;接下来介绍一下如何在Ubuntu上安装IDEA。 壹、下载 这一步应该很容易的&#xff0c;直接打开IDEA的下载页面&#xff0c;点击下…

Python RabbitMQ 入门 pika

Python RabbitMQ 入门 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

基于vue的酒店预订管理系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Paperless-ngx文档管理系统本地部署并实现远程使用搜索查阅文件

文章目录 前言1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux系统本地部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署…

Visual Studio 2022安装(含重生版)

前言&#xff1a; 昨天调试代码的时候发现程序怎么都运行不了&#xff0c;错误显示无法找到文件啊啊啊&#xff0c;能力有限&#xff0c;找不出错误源&#xff0c;然后就狠心删掉所有相关文件来“重新开始”&#xff01; 正文&#xff1a; 1.官网下载&#xff08;内定中文版…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…

前后分离项目记录

一.前端设置 1.打包问题 打包报错 Thread Loader时&#xff0c;增加以下代码&#xff1a; 上线&#xff0c;打包prod时: 2.上线时api设置 二.Nginx问题 1.缓存问题&#xff1a;添加如下代码以禁止缓存&#xff0c;否则在关闭nginx后仍然可以访问页面 2.跨域问题在后端加Cr…

六西格玛设计DFSS方法论在消费级无人机设计中的应用——张驰咨询

本文基于六西格玛设计方法论&#xff0c;对消费级无人机的设计流程进行系统化研究&#xff0c;探讨如何通过六西格玛设计的理念、工具和方法提升无人机产品的设计质量和市场竞争力。文章从市场定位、客户需求分析出发&#xff0c;深入到关键KPI指标的制定&#xff0c;并逐步阐述…

十、索引优化与查询优化

文章目录 1. 数据准备2. 索引失效案例2.1 全值匹配我最爱2.2 最佳左前缀法则2.3 主键插入顺序2.4 计算、函数、类型转换(自动或手动)导致索引失效2.5 类型转换导致索引失效2.6 范围条件右边的列索引失效2.7 不等于(!=或者<>)索引失效2.8 is null 可以使用索引,is not …

STM32 USB CUBEMX

开发背景 使用的平台&#xff1a;STM32H750 注意事项 时钟必须是48MHZ&#xff0c;其它都不行 2. 将默认任务的堆栈设大一点 如果使用操作系统&#xff0c;USB任务跑在默认任务里&#xff0c;因此需要设置默认任务的堆栈缓存是直接定义的全局变量&#xff0c;需要设置编译器…

通过阿里云Milvus和通义千问快速构建基于专属知识库的问答系统

本文展示了如何使用阿里云向量检索Milvus和灵积&#xff08;Dashscope&#xff09;提供的通用千问大模型能力&#xff0c;快速构建一个基于专属知识库的问答系统。在示例中&#xff0c;我们通过接入灵积的通义千问API及文本嵌入&#xff08;Embedding&#xff09;API来实现LLM大…

中标麒麟操作系统:如何查看系统激活状态

中标麒麟操作系统&#xff1a;如何查看系统激活状态 1、图形界面查看方法方法一&#xff1a;任务栏查看方法二&#xff1a;通过“我的电脑”属性查看 2、命令行查看方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 本文将介绍两种查看系…

【AI 工具分享】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

自动驾驶系列—厘米级精度:RTK技术如何革新自动驾驶定位

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Python画图|多图共享X轴和Y轴

【1】引言 在python画图的众多场景中&#xff0c;存在多图对应X轴和Y轴可能一致的情形。 为此&#xff0c;尝试找到相关方法&#xff0c;不仅可以将代码写得更简洁&#xff0c;也更节省电脑内存&#xff0c;是提升工作效率的可选之路。 【2】官网教程 点击下方链接&#xf…