From c23a27970e1a4c76df36b7177eed0ba4006274a5 Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Sun, 3 May 2020 20:01:49 +0800 Subject: [PATCH] add 621. Task Scheduler :beer: --- README.md | 1 + solutions/621. Task Scheduler.md | 84 +++++++++++++++++++++++++++++++ solutions/img/621.png | Bin 0 -> 14768 bytes 3 files changed, 85 insertions(+) create mode 100644 solutions/621. Task Scheduler.md create mode 100644 solutions/img/621.png diff --git a/README.md b/README.md index f787ec8..2f77fd0 100644 --- a/README.md +++ b/README.md @@ -322,6 +322,7 @@ My LeetCode solutions with Chinese explanation. 我的LeetCode中文题解。 | 581 |[Shortest Unsorted Continuous Subarray](https://leetcode.com/problems/shortest-unsorted-continuous-subarray)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/581.%20Shortest%20Unsorted%20Continuous%20Subarray.md)|Easy| | | 605 |[Can Place Flowers](https://leetcode.com/problems/can-place-flowers)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/605.%20Can%20Place%20Flowers.md)|Easy| | | 617 |[Merge Two Binary Trees](https://leetcode.com/problems/merge-two-binary-trees/)|[C++](solutions/617.%20Merge%20Two%20Binary%20Trees.md)|Easy| | +| 621 |[Task Scheduler](https://leetcode.com/problems/task-scheduler/)|[C++](solutions/621.%20Task%20Scheduler.md)|Medium| | | 628 |[Maximum Product of Three Numbers](https://leetcode.com/problems/maximum-product-of-three-numbers)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/628.%20Maximum%20Product%20of%20Three%20Numbers.md)|Easy| | | 643 |[Maximum Average Subarray I](https://leetcode.com/problems/maximum-average-subarray-i)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/643.%20Maximum%20Average%20Subarray%20I.md)|Easy| | | 661 |[Image Smoother](https://leetcode.com/problems/image-smoother)|[C++](https://github.com/ShusenTang/LeetCode/blob/master/solutions/661.%20Image%20Smoother.md)|Easy| | diff --git a/solutions/621. Task Scheduler.md b/solutions/621. Task Scheduler.md new file mode 100644 index 0000000..a3507cf --- /dev/null +++ b/solutions/621. Task Scheduler.md @@ -0,0 +1,84 @@ +# [621. Task Scheduler](https://leetcode.com/problems/task-scheduler/) + +# 思路 + +## 思路一、暴力模拟 + +首先应该明确我们始终**应该优先处理出现次数最多的任务**。为此我们可以模拟这个过程,先统计每个字母的次数,然后将这些次数送入到一个优先队列(最大堆)里,然后每一轮都从优先队列里面取`n+1`个元素出来将其次数减一,不断重复这个过程直到队列空。 + +设任务总数为N,不同的任务数为M(M<=26),那么时间复杂度为O(NlogM),空间复杂度为O(M)。亲测此方法500ms左右,效率较低。 + +## 思路二 + +还是按照优先处理出现次数最多的任务这个原则。我们假设 A 为出现次数最多的任务,假设其出现了 p 次,考虑到冷却时间,那么执行完所有任务的时间至少为 `(p - 1) * (n + 1) + 1`,如下左图所示,其中浅色代表空闲时间。 + +
+ +
+ +然后我们应当考虑把剩余的任务安排到这些空闲时间里,先将这些任务的出现次序,从大到小进行安排,会有下面两种情况: +* 某个任务和 A 出现的次数相同,例如图 2 中的任务 B。此时我们只能让 B 占据 p - 1 个空闲时间,而在非空闲时间里额外安排一个时间给 B 执行; +* 某个任务比 A 出现的次数少,例如图 2 中的任务 C 和 D。此时我们可以按照列优先的顺序,将其填入空闲时间中。 + +如果在安排某一个任务时,遇到了剩余的空闲时间不够的情况,那么答案一定就等于任务的总数。这是因为我们可以将空闲时间增加虚拟的一列,继续安排任务。 + +所以我们只需要求出出现次数最大(设为`mx`)的任务A,以及出现次数和A同样多的任务(即B这种)数`mx_cnt`,这样最终结果就为`max(N, (n + 1) * (mx - 1) + mx_cnt)`,其中N为任务总数。 + +空间复杂度O(1),时间复杂度O(N) + +[参考来源](https://leetcode-cn.com/problems/task-scheduler/solution/ren-wu-diao-du-qi-by-leetcode/) + + + + + +# C++ +## 思路一 +``` C++ +class Solution { +public: + int leastInterval(vector& tasks, int n) { + if(n == 0) return tasks.size(); + vectorcnt(26, 0); + for(char t: tasks) cnt[t - 'A']++; + + priority_queuemaxheap; + for(int i: cnt) if(i > 0) maxheap.push(i); + + int res = 0; + while(!maxheap.empty()){ + vectortmp; // 存放从maxheap取出的元素 + for(int i = 0; i <= n; i++){ + if(maxheap.empty()) { + if(!tmp.empty()) res += n + 1 - i; // idle + break; + } + res += 1; + auto num = maxheap.top(); maxheap.pop(); + if(--num > 0) tmp.push_back(num); + } + + for(auto a: tmp) maxheap.push(a); // 放回队列中 + } + + return res; + } +}; +``` + +## 思路二 +``` C++ +class Solution { +public: + int leastInterval(vector& tasks, int n) { + vectorcnt(26, 0); + for(char t: tasks) cnt[t - 'A']++; + + int mx = cnt[0], mx_cnt = 0; + for(int i: cnt) mx = max(mx, i); + for(int i: cnt) if(i == mx) mx_cnt++; + + return max((int)tasks.size(), (n + 1) * (mx - 1) + mx_cnt); + } +}; +``` \ No newline at end of file diff --git a/solutions/img/621.png b/solutions/img/621.png new file mode 100644 index 0000000000000000000000000000000000000000..2068a1a1e9ac5f28672d26aad398b0f94b849b46 GIT binary patch literal 14768 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