这道题之前尝试做过,没有做出来,今天看了左大佬的视频,豁然开朗了.自己改写了javascript版本的.
-
思路:
-
- 首先找到出现次数最多的任务,并把这个最多次数存下来
-
- 可能不止一种任务出现最多次,所以还要知道哪些任务出现了最多次
-
- 按照出现最多次的任务数分组,
-
- 最后一组可以直接从任务总数中删除,因为任务都是插入到组与组的中间,不放最后端
-
- 计算出位置数
-
- 算出空格数,空格数是负数或者是0,统一取0
-
- 加上任务总长度,既可以得到最短的时间啦
-
有空再补充图形演示
-
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。
然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的 最短时间 。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ta… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int leastInterval(char[] tasks, int n) {
int[] count = new int[256];
int maxCount = 0; // 出现多次的任务,到底出现了多少次
for(char task:tasks) {
count[task]++;
maxCount = Math.max(maxCount, count[task]);
}
// 有多少中任务出现了最多次
int maxKinds = 0;
for(int task = 0; task < 256; task++) {
if(count[task] == maxCount) {
maxKinds++;
}
}
// 砍掉最后一组剩余的任务数量
int taskExceptFinalTeam = tasks.length - maxKinds;
int spaces = (n + 1) * (maxCount - 1);
int restSpaces = Math.max(0,spaces - taskExceptFinalTeam);
return tasks.length + restSpaces;
}
}
/**
* @param {character[]} tasks
* @param {number} n
* @return {number}
*/
var leastInterval = function (tasks, n) {
let map = new Map();
let maxCount = 0;// 出现最多次数的任务到底出现了几次
for (let i = 0; i < tasks.length; i++) {
map.get(tasks[i]) ?
map.set(tasks[i], map.get(tasks[i])+1)
: map.set(tasks[i], 1)
maxCount = Math.max(maxCount, map.get(tasks[i]))
}
// 有多少种任务出现最多次
let maxCountTaskKinds = 0;
for(let [task,taskCount] of map) {
if(taskCount == maxCount) maxCountTaskKinds++
}
// 去掉最后一组任务数量
let taskExceptFinalTeam = tasks.length - maxCountTaskKinds;
let spaces = (n + 1) * (maxCount - 1);
let restSpaces = Math.max(0, spaces - taskExceptFinalTeam)
return tasks.length + restSpaces;
};