Skip to content

Latest commit

 

History

History
84 lines (66 loc) · 2.83 KB

621-task-scheduler.md

File metadata and controls

84 lines (66 loc) · 2.83 KB

621. Task Scheduler - 任务调度器

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

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

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

示例 1:

输入: tasks = ["A","A","A","B","B","B"], n = 2
输出: 8
执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.

注:

  1. 任务的总个数为 [1, 10000]。
  2. n 的取值范围为 [0, 100]。

题目标签:Greedy / Queue / Array

题目链接:LeetCode / LeetCode中国

题解

Language Runtime Memory
cpp 1376 ms 1.4 MB
class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        auto cmp = [](pair<char, int>& p1, pair<char, int>& p2) { return p1.second < p2.second; };
        priority_queue<pair<char, int>, vector<pair<char, int> >, decltype(cmp)> pq(cmp);
        unordered_map<char, int> mm;
        for (char t : tasks) {
            mm[t]++;
        }
        for (auto m : mm) {
            pq.emplace(make_pair(m.first, m.second));
        }
        deque<char> q;
        size_t pre;
        vector<pair<char, int> > ts;
        while (!pq.empty()) {
            ts.clear();
            pre = q.size();
            while (!pq.empty()) {
                auto t = pq.top();
                if (find((int)q.size() > n ? q.end()-n : q.begin(), q.end(), t.first) == q.end()) {
                    q.emplace_back(t.first);
                    pq.pop();
                    if (t.second > 1) {
                        pq.emplace(make_pair(t.first, t.second-1));
                    }
                    break;
                }
                ts.emplace_back(t);
                pq.pop();
            }
            for (int i=(int)ts.size()-1; i>=0; --i) {
                pq.emplace(ts[i]);
            }
            if (pre == q.size()) {
                q.emplace_back('0');
            }
        }
        return q.size();
    }
};