题目描述:
给你一个二维数组 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

方法1:
主要思路:解题链接汇总
(1)优先队列;
(2)为了保存原数组中各个元素对应的原来的索引值,先将原来的索引压入对应的数组中进行保存;
(3)对数组进行排序,排序的规则使用第一个元素进行升序排序,既使用加入队列的时间进行排序;
(4)对排序后的数组进行遍历,这里使用单独一个变量,用来记录当前时间,每次把数组中的任务的入队时间小于等于当前时间的任务压入到优先队列中;
(5)从当前队列中取出第一个元素,即为当前CPU处理的元素;
(6)直到数组中没有元素;
(7)将优先队列中的元素全部取出,依次放入结果中;

class Solution {public:vector<int> getOrder(vector<vector<int>>& tasks) {for(int i=0;i<tasks.size();++i){tasks[i].push_back(i);//存储对应的索引}//使用入队时间进行排序sort(tasks.begin(),tasks.end(),[](auto&lhs,auto&rhs){return lhs[0]<rhs[0];});//存储结果vector<int>res;priority_queue<vector<int>,vector<vector<int>>,greater<vector<int>>> q;int cur_time=0;//当前时间for(int i=0;i<tasks.size();){if(q.empty()){//获得新的当前时间cur_time=max(cur_time,tasks[i][0]);}//将入队时间小于等于当前时间的任务压入到优先队列中while(i<tasks.size()&&tasks[i][0]<=cur_time){q.push({tasks[i][1],tasks[i][2]});++i;}//新的当前时间cur_time+=q.top()[0];res.push_back(q.top()[1]);//保存结果q.pop();//弹出}//保存所有结果while(!q.empty()){res.push_back(q.top()[1]);q.pop();}return res;}
};

1834 单线程 CPU相关推荐

  1. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)

    LeetCode--1834. 单线程 CPU[Single-Threaded CPU][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 优先队列 (1)思路 (2)代码 (3)结果 ...

  2. LeetCode 1834. 单线程 CPU(排序 + 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务. 其中 tasks[i] = [enqueueTimei, ...

  3. 1834 单线程 CPU(lambda表达式排序 + 优先队列)

    1. 问题描述: 给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务.其中 tasks[i] = [enqueueTimei, processingTime ...

  4. 【C++】LeetCode 题库 1834. 单线程 CPU

    原题链接 问题描述 给你一个二维数组 tasks ,用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务.其中 tasks[i] = [enqueueTimei, processingTim ...

  5. 【算法题】1834. 单线程 CPU

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个二维数组 tasks ,用于表示 ...

  6. LeetCode题解(1834):单线程CPU(Python)

    题目:原题链接(中等) 标签:堆.排序 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O ( N l o g N ) O(NlogN) O(NlogN) O ( N ) O(N ...

  7. Leetcode 1834. Single-Threaded CPU [Python]

    使用heap.把task按照进队列时间,持续时间,和原始的index组成新的三元组然后排序,设置一个时间T,记录当前的时间,设置一个队列,就是已经入队列的cpu待处理的任务,当tasks里的任务的时间 ...

  8. Java PriorityQueue(优先级队列/二叉堆)的使用及题目应用

    目录 PriorityQueue有几个需要注意的点: 重写比较器的方法 应用题目 LeetCode 1845. 座位预约管理系统 LeetCode 215. 数组中的第 K 个最大元素(同剑指 Off ...

  9. 算法框架专辑80分版本

    文章目录 序言 TODO : 每个框架10个题默写3遍 背包问题 排序 堆排序 多线程 数据结构设计(LRU.LFU要求熟练背诵并默认) LRU LFU 红黑树 跳表 练习题 labuldong 的刷 ...

最新文章

  1. [转]HTTP协议详解
  2. R语言将多分类数据集转化为二分类数据集,使用条件判断将多分类转化为二分类(transform dataset into a dichotomous factor response dataset)
  3. 超级详细的解决方法 (CentOS7) :永久修改 mysql read-only 问题 could not retrieve transation read-only status server
  4. 這麼多年興許從來沒有釋放過
  5. 聚簇索引和非聚簇索引详解
  6. Python《爬虫再练手》
  7. 【Kafka】BrokerNotAvailableException: Error choosing node for describeLogDirs: no node found.
  8. 《Effective STL中文版》前言
  9. Linux vmstat命令实战详解
  10. 三维点云处理(5)——Clustering
  11. 靶机渗透练习21-Noob
  12. python基础 class6(基本统计值计算、文本词频统计)
  13. 解决cannot find module providing package或cannot find main module
  14. 战火与秩序迁城显示服务器忙,战火与秩序迁城方法介绍
  15. 什么 ? 陪玩都月入过忘拉~这不得python采集一下
  16. 简体-繁体互转换的一个JS
  17. 华为HMS全球应用创新大赛启动 百万美元奖金激励开发者
  18. Basler相机调用及图像存储
  19. php微信头像下载,微信2000个头像打包下载
  20. 安装Nvidia的PS插件后无法打开DDS文件格式

热门文章

  1. 模具厂干了将近三年,目前想学模具设计,好学吗
  2. Macbookpro m1安装jdk、maven和问题解决
  3. sql rank()函数
  4. 使用云函数构建短信验证码服务的案例
  5. mobx 源码解读(四):讲讲 autorun 和 reaction
  6. 奇瑞小蚂蚁,专为年轻人打造的高端纯电小车
  7. NAS4Free 安装配置(五)配置SMB
  8. Android的含义百度百科,android是什么意思
  9. HTML5 雪花飘落JS特效
  10. 这不是演习:黑客在5分钟内搞定Nexus 6P