Leetcode 621, Task Scheduler
题目描述:有A-Z种任务,每个任务有i个,规定在同一种任务必须间隔n个以上,求最小的执行时间。
思路:先求出每一种任务各有多少个,然后排序,将最多的取出来,留下n个空间,然后把剩下的比它少的插进去,如果所有的间隔都插满了,那么执行时间间隔就是任务的总数,这里的间隔即时插满了,如果还有任务未填充,依旧可以填充到尾部不算溢出,因为题目只要求间隔n个以上,如果没有插满,说明还有间隔,就需要计算需要的时间,比如一共有m种相同的任务,需要n个间隔,那么除去最后一种执行完了就可以不需要添加间隔,前面的n-1个每一个都需要(k+1)个执行时间,所以总时间是(n-1)(k+1),但是最多的任务并不只有一种有m种每种n个的时候,每一种的前面n-1个都已经放好了,只有最后面的一个不需要间隔直接执行,所以这种情况下总时间为 (n-1) (k+1) + m,如果间隔被填满了那么总时间就是数组长度,如果没有那就是以上计算结果。
class Solution {
public:
int leastInterval(vector<char>& tasks, int n) {
int res[26] = {0};
for(int i = 0; i < tasks.size(); i++)
res[tasks[i] - 'A']++;
sort(res, res+26);
int ans = (res[25] - 1) * (n + 1);
for(int i = 25; i >= 0 && res[i] == res[25]; i--)
ans++;
return max(ans, (int)tasks.size());
}
};