1、构造矩阵
我们假设所有任务中需要执行次数最多的任务执行次数为 m a x E x e c maxExec maxExec,则我们可以使用一个 m a x E x e c × ( n + 1 ) maxExec\times(n+1) maxExec×(n+1)的矩阵来容纳所有任务。假设执行次数为 m a x E x e c maxExec maxExec的任务有 m a x C o u n t maxCount maxCount个,则显然对应的总时间为 ( m a x E x e c − 1 ) ( n + 1 ) + m a x C o u n t (maxExec-1)(n+1)+maxCount (maxExec−1)(n+1)+maxCount。
我们同时需要考虑一种特殊情况,即 m a x C o u n t maxCount maxCount的值大于 n n n时,此时由于间隔的时间小于待完成的任务数,故此时系统不会休息将一致工作,此时花费的时间为任务的个数。
class Solution {
public:
int leastInterval(vector<char> &tasks, int n) {
unordered_map<char, int> freq;
for (char ch: tasks) {
++freq[ch];
}
int maxExec = max_element(freq.begin(), freq.end(), [](const auto &u, const auto &v) {
return u.second < v.second;
})->second;
int maxCount = accumulate(freq.begin(), freq.end(), 0, [=](int acc, const auto &u) {
return acc + (u.second == maxExec);
});
return max((maxExec - 1) * (n + 1) + maxCount, static_cast<int>(tasks.size()));
}
};