leetcode621. 任务调度器

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个相同种类 的任务之间必须有长度为n的冷却时间。

返回完成所有任务所需要的最短时间间隔

示例 1:

**输入:**tasks = "A","A","A","B","B","B", n = 2

**输出:**8

解释:

在完成任务 A 之后,你必须等待两个间隔。对任务 B 来说也是一样。在第 3 个间隔,A 和 B 都不能完成,所以你需要待命。在第 4 个间隔,由于已经经过了 2 个间隔,你可以再次执行 A 任务。

示例 2:

**输入:**tasks = "A","C","A","B","D","B", n = 1

**输出:**6

**解释:**一种可能的序列是:A -> B -> C -> D -> A -> B。

由于冷却间隔为 1,你可以在完成另一个任务后重复执行这个任务。

示例 3:

**输入:**tasks = "A","A","A","B","B","B", n = 0

**输出:**6

**解释:**一种可能的序列为:A -> B -> idle -> idle -> A -> B -> idle -> idle -> A -> B。

只有两种任务类型,A 和 B,需要被 3 个间隔分割。这导致重复执行这些任务的间隔当中有两次待命状态。

提示:

  • 1 <= tasks.length <= 104
  • tasks[i] 是大写英文字母
  • 0 <= n <= 100
javascript 复制代码
/**
 * @param {character[]} tasks
 * @param {number} n
 * @return {number}
 */
// 621. 任务调度器 
// lodash.js 插件库,这个题里面的所有函数都是这个库里面的
var leastInterval = function(tasks, n) {

    const freq = _.countBy(tasks);
    // maxExec 是任务数最多的次数 maxExec

    // 方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
    const maxExec = Math.max(...Object.values(freq));
    
    // maxCount是 最多任务数量的任务种类
    let maxCount = 0;
    Object.values(freq).forEach(v => {
        if (v === maxExec) {
            maxCount++;
        }
    })
    // n是同任务的等待时间/冷却时间
    return Math.max((maxExec - 1) * (n + 1) + maxCount, tasks.length);
};

补充说明:

javascript 复制代码
const freq = _.countBy(tasks);分析这段代码

这段代码使用了Lodash库中的countBy函数,它用于对数组中的元素进行分组计数。

具体来说,_.countBy(tasks)会对tasks数组中的每个元素进行计数,并返回一个对象,其中对象的键是数组中的元素,值是该元素在数组中出现的次数。

举个例子,如果tasks数组如下:

javascript 复制代码
const tasks = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana'];

那么执行_.countBy(tasks)后的结果将会是:

javascript 复制代码
{
  apple: 2,
  banana: 3,
  orange: 1
}

这个结果表示'apple'出现了2次,'banana'出现了3次,而'orange'出现了1次。

相关推荐
captain3765 分钟前
▲网络原理(2)-TCP
java·服务器·网络·tcp/ip·java-ee
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
土司大王1 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹1 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
言乐61 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
土司大王1 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
爱吃苹果的日记本2 小时前
数据结构第三课(时间复杂度)
数据结构·学习
罗西的思考3 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
几何心凉3 小时前
没有万能模型:我用 AiiOnly Token Plan,把多款大模型的长处拼进同一个项目
前端