621. 任务调度器
题目描述:
给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
示例 :
输入:tasks = ["A","A","A","B","B","B"], n = 2
输出:8
解释:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。
提示:
任务的总个数为 [1, 10000]。
n 的取值范围为 [0, 100]。
思想:
设至少有一种任务A出现次数最多,最大出现次数记为cnt_max
设出现次数与cnt_max相等的任务有equal_cnt_max个
1、有cnt_max个A任务,共有(cnt_max-1)个间隔,每个间隔题目要求插入n个不同的任务,凑不够n个不同任务我们用“待命”来填充。
2、最后一个A后面可能还有其他任务,此时的其他任务只能是出现次数等于cnt_max的任务,不然它早就全部用来填充((cnt_max-1))个间隔了(每个间隔需填充一个)
3、特殊情况是n=0,则题目求出来的答案应该是任务的总数,即代码中的task.size();
4、答案要包括任务A的个数,所以答案 ans = max((cnt_max-1)*n + cnt_max + equal_cnt_max,tasks.size())
代码:
class Solution { public: int leastInterval(vector<char>& tasks, int n) { vector<int> cnt(26,0); int cnt_max = 0, equal_cnt_max = -1; // equal_cnt_max初值为-1是因为后面的循环会多算一次 for(auto i:tasks) cnt[i-'A']++; for(auto i:cnt){ cnt_max = max(i,cnt_max); } for(auto i:cnt) if(cnt_max == i) equal_cnt_max++; int time = max((cnt_max-1) * n + cnt_max + equal_cnt_max,(int)tasks.size()); return time; } };