美文网首页
621. Task Scheduler

621. Task Scheduler

作者: STACK_ZHAO | 来源:发表于2019-10-15 19:57 被阅读0次

题目描述

给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。

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

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

解题思路

所以整体的解题步骤如下:

计算每个任务出现的次数
找出出现次数最多的任务,假设出现次数为 x
计算至少需要的时间 (x - 1) * (n + 1),记为 min_time
计算出现次数为 x 的任务总数 count,计算最终结果为 min_time + count

code [python]

class Solution(object):
    def leastInterval(self, tasks, n):
        """
        :type tasks: List[str]
        :type n: int
        :rtype: int
        """
        length = len(tasks)
        if length <= 1:
            return length
        
        # 用于记录每个任务出现的次数
        task_map = dict()
        for task in tasks:
            task_map[task] = task_map.get(task, 0) + 1
        # 按任务出现的次数从大到小排序
        task_sort = sorted(task_map.items(), key=lambda x: x[1], reverse=True)
        
        # 出现最多次任务的次数
        max_task_count = task_sort[0][1]
        # 至少需要的最短时间
        res = (max_task_count - 1) * (n + 1)
        
        for sort in task_sort:
            if sort[1] == max_task_count:
                res += 1
        
        # 如果结果比任务数量少,则返回总任务数
        return res if res >= length else length

C++ code

//任务调度
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<unordered_map>
using namespace std;
class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
       //获取每个记录中任务出现的次数
        int time_count = 0;
        unordered_map<char,int> hash;
        for(auto a:tasks){
            hash[a]++;
        }
        priority_queue<int>queue1, queue2;
        for (auto a : hash) {
            queue1.push(a.second);
        }
        bool end_in_this_round = false;
        while (1) {
            if (queue1.empty())return time_count;//queue1.top() == 1表明即将执行最后一轮
            if (queue1.top() == 1)end_in_this_round = true;
            for (int i = 0; i <= n; ++i) {//循环n+1次因为只要不退出,每轮必消耗n+1单位时间
                ++time_count;
                if (!queue1.empty()) {//queue1中的任务执行一次,保存到queue2中
                    if (queue1.top() > 1)queue2.push(queue1.top() - 1);
                    queue1.pop();
                }
                else {
                    if (end_in_this_round)return time_count - 1;
                }
            }
            while (!queue1.empty()) {
                queue2.push(queue1.top());//将未执行的任务搬运到queue2
                queue1.pop();
            }
            swap(queue1, queue2);//交换引用
        }
    }
};
int main(){
   int n;
   vector<char> task;
   char s;
   cin>>n;
   int i=0;
   while(i<6){
    cin>>s;
    task.push_back(s);
    i=i+1;
   }
   Solution sk;
   int time1=sk.leastInterval(task,n);
   cout<<time1;
}

相关文章

网友评论

      本文标题:621. Task Scheduler

      本文链接:https://www.haomeiwen.com/subject/pcqemctx.html