📌  相关文章
📜  计算 Array 中存在严格更小和严格更大的元素的元素(1)

📅  最后修改于: 2023-12-03 15:41:36.707000             🧑  作者: Mango

计算 Array 中存在严格更小和严格更大的元素的元素

本文介绍一种算法,该算法通过遍历数组来计算数组中存在严格更小和严格更大的元素的元素。

算法思路

第一遍遍历数组,计算每个元素左侧最大的数,即严格更小的元素。第二遍遍历数组,计算每个元素右侧最小的数,即严格更大的元素。最后遍历数组,找出同时拥有严格更小和严格更大元素的元素。

实现步骤
  1. 初始化一个全局数组 leftMax,其中 leftMax[i] 存储数组中下标小于 i 的最大元素。
  2. 从左到右遍历一次数组,计算 leftMax[i]
  3. 初始化一个全局数组 rightMin,其中 rightMin[i] 存储数组中下标大于 i 的最小元素。
  4. 从右到左遍历一次数组,计算 rightMin[i]
  5. 遍历一次数组,找出同时拥有严格更小和严格更大元素的元素。

实现代码如下:

function findElements(array) {
  let n = array.length;
  let leftMax = new Array(n).fill(-1);
  let rightMin = new Array(n).fill(-1);

  let currMax = -Infinity;
  for (let i = 0; i < n; i++) {
    leftMax[i] = currMax;
    currMax = Math.max(currMax, array[i]);
  }

  let currMin = Infinity;
  for (let i = n - 1; i >= 0; i--) {
    rightMin[i] = currMin;
    currMin = Math.min(currMin, array[i]);
  }

  let output = [];
  for (let i = 0; i < n; i++) {
    if (leftMax[i] < array[i] && array[i] < rightMin[i]) {
      output.push(i);
    }
  }

  return output;
}

let array = [3, 7, 2, 5, 6, 1, 4];
console.log(findElements(array)); // Output: [1, 3, 4]
算法分析
时间复杂度

该算法只需遍历数组三次。因此,该算法的时间复杂度为 O(n),其中 n 是数组中的元素数量。

空间复杂度

该算法需要使用两个大小为 n 的数组 leftMaxrightMin。因此,该算法的空间复杂度为 O(n),其中 n 是数组中的元素数量。

总结

此算法比起暴力算法可以在较短的时间内找到存在严格更小和严格更大的元素的元素。同时,它的空间复杂度也较小,适用于中等大小的数组。