LeetCode HOT100 - 任务调度器

显然,我们要去关注出现次数最大的那个

因为出现次数最大中间的空隙需要用其他任务去填充

假设出现次数最多的是 A,出现了 3 次,n = 2

因为两个 A 之间至少隔 2 个时间,所以无论怎么排,至少要有:

A _ _ A _ _ A

这里的空位就是必须被其他任务填的地方。

如果最高频任务不止一个,比如 AB 都出现 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);
    }
};
posted @ 2026-05-05 00:28  rdcamelot  阅读(21)  评论(0)    收藏  举报