📅  最后修改于: 2023-12-03 15:10:05.852000             🧑  作者: Mango
本文将介绍如何解决一个常见的问题:如何找到出现在每个数组元素左侧的最近值。
给定一个整数数组,请编写一个函数来找到每个元素左侧的最近值。如果没有左侧的元素,则返回 -1。
例如,对于以下数组 [3, 8, 4, 1, 2, 6, 7]
,返回的数组应为 [-1, 3, 3, -1, 1, 2, 6]
。
我们可以通过遍历数组中的每个元素,然后在数组中查找它左侧的最近值来解决这个问题。对于每个元素,我们可以从它的左侧开始向右遍历,找到第一个比它小的元素并返回它的值。如果没有这样的元素,则返回 -1。
下面是一个 JavaScript 代码示例:
function findLeftNearest(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
let j = i - 1;
while (j >= 0) {
if (arr[j] < arr[i]) {
result.push(arr[j]);
break;
}
j--;
}
if (j < 0) {
result.push(-1);
}
}
return result;
}
const arr = [3, 8, 4, 1, 2, 6, 7];
console.log(findLeftNearest(arr)); // [-1, 3, 3, -1, 1, 2, 6]
上面的解决方案的时间复杂度为 $O(n^2)$,因为我们遍历了每个元素,并在它的左侧进行了另一个遍历。在数组较大时,性能可能会变慢。
我们可以通过使用数据结构来加速这个算法。例如,可以使用二叉搜索树、堆或单调栈等数据结构来维护数组中的元素。这样,我们可以快速找到左侧的最近值而不必通过遍历来查找。
下面是使用单调栈的 JavaScript 代码示例:
function findLeftNearestStack(arr) {
const result = [];
const stack = [];
for (let i = 0; i < arr.length; i++) {
while (stack.length && stack[stack.length - 1] >= arr[i]) {
stack.pop();
}
result.push(stack.length ? stack[stack.length - 1] : -1);
stack.push(arr[i]);
}
return result;
}
const arr = [3, 8, 4, 1, 2, 6, 7];
console.log(findLeftNearestStack(arr)); // [-1, 3, 3, -1, 1, 2, 6]
这个算法的时间复杂度为 $O(n)$,因为我们遍历了每个元素并将其压入栈中,操作时间为 $O(1)$。在数组较大时,这个算法比上一个算法更加高效。
在这篇文章中,我们讨论了如何找到出现在每个数组元素左侧的最近值。我们介绍了两种解决方案:一种是暴力解决方案,时间复杂度为 $O(n^2)$;另一种是使用单调栈解决方案,时间复杂度为 $O(n)$。根据数组的大小和性能需求,可以选择最适合的算法。