📅  最后修改于: 2023-12-03 15:41:36.707000             🧑  作者: Mango
本文介绍一种算法,该算法通过遍历数组来计算数组中存在严格更小和严格更大的元素的元素。
第一遍遍历数组,计算每个元素左侧最大的数,即严格更小的元素。第二遍遍历数组,计算每个元素右侧最小的数,即严格更大的元素。最后遍历数组,找出同时拥有严格更小和严格更大元素的元素。
leftMax
,其中 leftMax[i]
存储数组中下标小于 i
的最大元素。leftMax[i]
。rightMin
,其中 rightMin[i]
存储数组中下标大于 i
的最小元素。rightMin[i]
。实现代码如下:
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 的数组 leftMax
和 rightMin
。因此,该算法的空间复杂度为 O(n),其中 n 是数组中的元素数量。
此算法比起暴力算法可以在较短的时间内找到存在严格更小和严格更大的元素的元素。同时,它的空间复杂度也较小,适用于中等大小的数组。