📌  相关文章
📜  找到最近的左右较小元素之间的最大差异(1)

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

找到最近的左右较小元素之间的最大差异

这是一个常见的问题,可以用单调栈来解决。单调栈是一个栈,其中存储的元素是单调递增或单调递减的。对于本问题,我们需要维护一个从栈底到栈顶单调递减的栈,栈中的元素是数组的下标。

首先,我们遍历数组,对于每个元素,我们在栈顶弹出所有小于它的元素,并计算它们和右边第一个小于它的元素之间的差异,取所有差异的最大值即可。

代码如下:

def max_difference(arr):
    """
    找到最近的左右较小元素之间的最大差异
    :param arr: 数组
    :return: 最大差异
    """
    stack = []
    max_diff = 0
    for i in range(len(arr)):
        while stack and arr[stack[-1]] > arr[i]:
            j = stack.pop()
            if stack:
                max_diff = max(max_diff, arr[j] - arr[stack[-1]])
            else:
                max_diff = max(max_diff, arr[j])
        stack.append(i)
    while stack:
        j = stack.pop()
        if stack:
            max_diff = max(max_diff, arr[j] - arr[stack[-1]])
        else:
            max_diff = max(max_diff, arr[j])
    return max_diff

这个算法的时间复杂度是O(n),空间复杂度O(n)。