[leetcode]621. Task Scheduler
来源:互联网 发布:linux服务器宕机原因 编辑:程序博客网 时间:2024/06/06 17:33
题目链接:https://leetcode.com/problems/task-scheduler/#/description
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where different letters represent different tasks.Tasks could be done without original order. Each task could be done in one interval. For each interval, CPU could finish one task or just be idle.
However, there is a non-negative cooling interval n that means between twosame tasks, there must be at least n intervals that CPU are doing different tasks or just be idle.
You need to return the least number of intervals the CPU will take to finish all the given tasks.
Example 1:
Input: tasks = ['A','A','A','B','B','B'], n = 2Output: 8Explanation: A -> B -> idle -> A -> B -> idle -> A -> B.
Note:
- The number of tasks is in the range [1, 10000].
- The integer n is in the range [0, 100].
思路:
贪心算法
- 可以把一次调度看成是一个长度为n+1的环。cycle = n + 1. 如果这cycle个坑,必须由不同的task来填。如果没有这么多种类的task,那么剩下的坑cpu就只能空转
- 那么填坑的时候使用哪些task那,我们尽可能的使用出现次数多的task 因为task不能重复,我们需要尽量使用其他的task来隔开出现次数最多的task,否则就要用idle来隔开他们。
- 算法的思路就是首先记录出每个task出现的次数,然后把这些次数记录到一个priority_queue中,因为我们只需要知道次数就行了,所以不用再管task的名称。priority_queue默认是大顶堆,也就是出现次数多的task会先出队列。每次遍历时,我们把pq中的task全部出队列,如果这时候cycle被填满了,那么就把task出现的次数全部减1 再添加到pq中去,总的运行时间需要cycle个cpu运转周期;如果cycle没有填满,那么说明需要补充一部分idle来填坑,运行时间同样增长cycle个cpu运转周期。
- 这里有两点需要注意:(1)把task出现次数添加会pq的时候,需要判断这一轮使用了一个task之后,该task剩余次数是否为0,如果为0,就不能再添加回去了,说明他已经调度完了。(2)如果在这一个cycle完成之后,发现没有task被重新添加到pq中去,说明所有的task都被调度完了,这一次的调度是最后一次,那么只需要添加实际的调度时间,而不是cycle个CPU运转周期。
class Solution {public: int leastInterval(vector<char>& tasks, int n) { map<char,int> m; for(int i=0;i<tasks.size();i++) m[tasks[i]]++; priority_queue<int> pq; for(auto ite:m) pq.push(ite.second); int cycle=n+1,ret=0; while(!pq.empty()) { vector<int> tmp; int time=0; for(int i=0;i<cycle;i++) { if(!pq.empty()) { tmp.push_back(pq.top()); pq.pop(); time++; } } for(auto cnt:tmp) { int remainCnt=cnt-1; if(remainCnt>0) pq.push(remainCnt); } if(pq.empty()) ret+=time; else ret+=cycle; } return ret; }};
阅读全文
0 0
- LeetCode 621. Task Scheduler
- 【LeetCode】621. Task Scheduler
- [LeetCode] 621. Task Scheduler
- Leetcode 621. Task Scheduler
- [leetcode]621. Task Scheduler
- leetcode 621. Task Scheduler
- Leetcode:621. Task Scheduler
- [LeetCode]621. Task Scheduler
- leetcode 621. Task Scheduler
- Leetcode 621. Task Scheduler
- leetcode 621. Task Scheduler
- leetcode 621. Task Scheduler (贪心)
- leetcode 621 Task Scheduler
- [Leetcode 621] Task Scheduler
- [leetcode] 621 Task Scheduler
- LeetCode Task Scheduler
- LeetCode-Task Scheduler
- LeetCode:Task Scheduler
- 使用Maven自动打包配置文件生成开发环境,测试环境,生产环境
- java学习(11) 枚举enum
- Uvalive3353 Optimal Bus Route Design 带权二分图匹配
- MySQL主从配置详解
- Openstack之Nova创建虚机流程分析
- [leetcode]621. Task Scheduler
- 安装JDK1.8.0_73 配置JAVA的环境变量
- java android 占位符
- C#数组的使用
- 在CentOS 7上安装Kafka
- Mysql知识点记录
- ctime , 时间转换(PE时间也这样转)
- 左耳朵耗子给出的学习指南
- 通过Scala面向函数思想,解决高考数学中的压轴数列题