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

相关推荐
予早15 分钟前
LeetCode 69. x 的平方根
算法·leetcode
傻Q爱20 分钟前
.NET 控制台应用程序连接 MySQL 数据库实现增删改查
mysql·c#
Jonathan Star42 分钟前
两个圆形 一个z里面一个z外面,z里面的大,颜色不同 html
前端·html
cndes1 小时前
元组(tuple)和列表(list)的区别及应用场合
数据结构·python
戊子仲秋1 小时前
【LeetCode】每日一题 2024_9_27 每种字符至少取 K 个(双指针)
算法·leetcode·职场和发展
学步_技术1 小时前
Python编码系列—Python模板方法模式:定义算法骨架,让子类实现细节
python·算法·模板方法模式
勇敢滴勇1 小时前
【排序算法】选择排序、堆排序
数据结构·算法·排序算法
MrBlackmzq1 小时前
Datawhale Leecode基础算法篇 task04:贪心算法
python·算法·贪心算法
禁默2 小时前
C++之stack 和 queue
开发语言·数据结构·c++
洛小豆2 小时前
前端开发必备:三种高效定位动态类名元素的 JavaScript 技巧
开发语言·前端·javascript·面试