📌  相关文章
📜  找到出现在每个数组元素左侧的最近值(1)

📅  最后修改于: 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)$。根据数组的大小和性能需求,可以选择最适合的算法。