📌  相关文章
📜  在每个数组元素的左侧计算更大的元素(1)

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

在每个数组元素的左侧计算更大的元素

当处理数组时,有时需要确定每个元素左侧的更大元素。可以使用某些算法来解决此问题,其中最简单且广泛使用的算法是“Stack based approach”。

算法介绍

想要以线性时间解决该问题,可以使用“Stack based approach”。基本思想是将数组元素从左到右扫描,并使用堆栈记录当前最大元素。对于每个元素,如果该元素大于堆栈顶部元素,则将该元素推送到堆栈中。否则,将堆栈中所有较小的元素弹出,直到堆栈顶部元素大于当前元素,然后将堆栈顶部元素作为当前元素左侧的比其更大的元素。程序员可以使用下面的算法来实现这一算法。

def calculate_left_greater_elements(arr):
    """
    Function to calculate the greater elements
    to the left of each array element.

    Arguments:
    arr -- list of integers

    Returns:
    greater -- list of integers with greater
               elements to the left of each array
               element.
    """
    stack = []
    greater = []
    for i in range(len(arr)):
        while stack and stack[-1] < arr[i]:
            stack.pop()
        if not stack:
            greater.append(-1)
        else:
            greater.append(stack[-1])
        stack.append(arr[i])
    return greater
示例

考虑以下数组:

arr = [2, 7, 3, 5, 4, 6, 8]

应用上述算法,可以得到以下输出:

[None, -1, 7, 7, 5, 7, 6]

这意味着,对于给定的数组arr中的第0个元素没有左侧的更大元素,而对于第1个元素,左侧的更大元素为-1,对于第2个元素,左侧的更大元素为7,以此类推。

总结

本文介绍了一种算法“Stack based approach”来计算每个元素左侧的更大元素。该算法时间复杂度为O(n),在实践中被广泛使用。程序员可根据上述算法实现其算法。