📌  相关文章
📜  Array 中每个元素的左侧小于当前元素的最大元素(1)

📅  最后修改于: 2023-12-03 14:59:23.146000             🧑  作者: Mango

Array 中每个元素的左侧小于当前元素的最大元素

在进行算法问题求解时,经常会遇到需要求解一个数组中每个元素左侧小于该元素的最大值的问题。这种问题可以采用单调栈的数据结构来解决。在此给程序员介绍使用单调栈来解决此问题的思路。

问题描述

假设我们有一个包含 n 个整数的数组 arr,我们需要对每个元素 arr[i] 找到一个元素 arr[j](j<i),使得 arr[j] 是左侧所有小于 arr[i] 的元素的最大值。如果不存在这样的元素 j,则将 arr[i] 的左侧小于 arr[i] 的最大值设置为 -1。

例如,对于数组 [3, 5, 2, 4, 6, 8],我们需要找到每个元素的左侧小于当前元素的最大元素。具体的结果如下:

-1, 3, -1, 2, 4, 6
解决思路

我们可以使用单调栈来解决此问题。我们从左到右扫描数组,维护一个单调递减栈,用来存储数组元素的下标。当我们遍历到元素 arr[i] 时,我们检查栈顶元素的值是否小于当前元素的值。如果是,我们将栈顶元素出栈,继续比较栈顶元素,直到栈为空或栈顶元素的值大于当前元素。我们可以发现,出栈的元素的左侧小于它的最大元素就是当前栈顶元素的值,如果栈为空,则当前元素的左侧小于它的最大元素为 -1。最后将当前元素的下标将入栈。

由于每个元素最多会被入栈一次和出栈一次,所以时间复杂度为 O(n)。因此,单调栈是解决此问题的非常有效的方法。

下面是使用 Python 语言实现此算法的代码示例。

def left_max(arr):
    """
    求数组中每个元素左侧小于该元素的最大值
    :param arr: list[int] 数组
    :return: list[int] 每个元素左侧小于该元素的最大值
    """
    stack = []
    result = [-1] * len(arr)
    for i in range(len(arr)):
        while stack and arr[stack[-1]] < arr[i]:
            result[stack.pop()] = arr[i]
        stack.append(i)
    return result

以上代码使用了 python 的列表模拟栈的数据结构。在遍历数组时,可以一次性处理出右侧小于当前元素的最大值,因此也可以采用类似的单调栈的方法来解决此问题。