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次。

相关推荐
西安小哥几秒前
从前端到AI工程师:一场跨越鸿沟的真实蜕变之旅
前端
Prince4184 分钟前
侧边栏收起缩放适配方案
前端
code bean8 分钟前
【C#】 `Channel<T>` 深度解析:生产者-消费者模式的现代解法
数据结构·c#
用户77833661321122 分钟前
serpbase + Cloudflare R2 边缘持久化实战
前端·人工智能
এ慕ོ冬℘゜25 分钟前
jQuery attr() 方法超详细讲解:属性获取、赋值、实战踩坑全解
前端·javascript·jquery
东方小月28 分钟前
从零开发一个 Coding Agent(三):EventStream 事件流通道设计与实现
前端·人工智能·后端
中微极客40 分钟前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek1 小时前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H1 小时前
开发者必须掌握的十大核心算法
算法
元Y亨H1 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法