LeetCode HOT100 - 任务调度器
显然,我们要去关注出现次数最大的那个
因为出现次数最大中间的空隙需要用其他任务去填充
假设出现次数最多的是 A,出现了 3 次,n = 2
因为两个 A 之间至少隔 2 个时间,所以无论怎么排,至少要有:
A _ _ A _ _ A
这里的空位就是必须被其他任务填的地方。
如果最高频任务不止一个,比如 A 和 B 都出现 3 次,那么最后一组要放 A B,也就是 A B _ A B _ A B,所以 (mx - 1) * (n + 1) + cnt
而比出现次数小的一定不会造成影响
因为我们可以轮流把小于的填进去
即出现次数少的任务不会比最高频任务更难安排
因为如果 A 出现最多,比如 A 有 3 个,那么其他任务最多也只有 3 个。
那么从轮次来看的话:
第 1 轮:A B C D
第 2 轮:A B C D
第 3 轮:A C D
同一种任务最多每轮放一次。
这样同一种任务之间天然被其他轮里的任务隔开,不会出现无法填充的情况
而且即使出现频次再少的元素再多也不会出现问题,是因为我们上面的间隔是必须的间隔,而不是唯一的间隔,也就是说,例如
n = 3
A 出现 3 次
B, C, D, E, F, G, H, I, J, K 各出现 2 次
这样的情况,我们可以直接把间隔拉长
再是同一种任务每轮最多放一次
比如 A B C D E F G H I J K A B C D E F G H I J K A
这样当然也合法
因此最后的答案就是让最多次数的能够满足的次数和长度的 max
class Solution {
public:
int leastInterval(vector<char>& tasks, int n) {
vector<int> a(26, 0);
for (char c : tasks) {
a[c - 'A']++;
}
int mx = *max_element(a.begin(), a.end());
int cnt = 0;
for (int x : a) {
if (x == mx) {
cnt++;
}
}
int ans = (mx - 1) * (n + 1) + cnt;
return max((int)tasks.size(), ans);
}
};

浙公网安备 33010602011771号