Skip to content

最短无序连续子数组 & 任务调度器

最短无序连续子数组

题目详情

给你一个整数数组nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

解题思路

要找到数组中的无序部分,在这可以分为两步:

  1. 从头找到第一个后面比前面小的数
  2. 从后找到第一个前面比后面大的数

这样就找到最短的无序数组了

代码实现

js
let n = nums.length;
//maxn 是到目前为止遇到的最大的数,
//right 是最后一个不符合升序排列的元素的索引
let maxn = -Number.MAX_VALUE,
  right = -1;
let minn = Number.MAX_VALUE,
  left = -1;
for (let i = 0; i < n; i++) {
  if (maxn > nums[i]) {
    right = i;
  } else {
    maxn = nums[i];
  }
  if (minn < nums[n - i - 1]) {
    left = n - i - 1;
  } else {
    minn = nums[n - i - 1];
  }
}
return right === -1 ? 0 : right - left + 1;

任务调度器

题目详情

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

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

解题思路

这道题重要的就是,最短时间只和最多的任务有关,因此只要最多的任务数目就行

代码实现

js
let taskMap = new Map();
for (let task of tasks) {
  taskMap.set(task, (taskMap.get(task) || 0) + 1);
}
let maxCount = 0,
  maxCountTaskNum = 0;
for (let count of taskMap.values()) {
  if (count > maxCount) {
    maxCount = count;
    maxCountTaskNum = 1;
  } else if (count === maxCount) {
    maxCountTaskNum++;
  }
}
return Math.max((maxCount - 1) * (n + 1) + maxCountTaskNum, tasks.length);

如有转载或 CV 的请标注本站原文地址