📌  相关文章
📜  Array 中每个元素的较大元素计数(1)

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

Array 中每个元素的较大元素计数

在编程中,经常会遇到需要找出数组中每个元素的较大元素的情况。这种情况有多种解决方法,下面将介绍其中两种常见的解决方法。

方法一:暴力枚举

暴力枚举的方法是最简单的方法,即对于数组中每个元素,遍历整个数组查找比它大的元素数量。

代码实现:

def count_greater_elements(arr):
    result = []
    for i in range(len(arr)):
        count = 0
        for j in range(i+1, len(arr)):
            if arr[j] > arr[i]:
                count += 1
        result.append(count)
    return result

代码解析:

对于每个元素 arr[i],遍历 arr[i+1:],如果存在元素大于 arr[i],则 count 加 1。最后将 count 添加到结果列表中,返回结果列表。时间复杂度为 $O(n^2)$。

方法二:单调栈

使用单调栈的方法可以将时间复杂度从 $O(n^2)$ 降至 $O(n)$。

代码实现:

def count_greater_elements(arr):
    stack = []
    result = [0] * len(arr)  # 初始化结果列表为 0,长度与 arr 相同
    for i, x in enumerate(arr):
        while stack and x > arr[stack[-1]]:
            j = stack.pop()
            result[j] = i - j
        stack.append(i)
    return result

代码解析:

使用单调栈的方法,对于每个元素 arr[i],如果存在比它大的元素,那么它们一定在栈中。利用栈的单调性质,可以始终保持栈中的元素是递减的。这样,在遍历 arr 的时候,如果发现当前元素比栈顶元素大,就弹出栈顶元素,并将当前元素与该元素之间的长度作为结果列表中该元素的值。最后将当前元素压入栈中。

比如,对于数组 arr=[4,3,2,1,5],从左到右依次遍历:

  • 遍历 4,压入栈中。
  • 遍历 3,比栈顶元素 4 小,压入栈中。
  • 遍历 2,比栈顶元素 3 小,压入栈中。
  • 遍历 1,比栈顶元素 2 小,压入栈中。
  • 遍历 5,比栈顶元素 1 大,依次弹出栈顶元素 1, 2, 3, 4,计算它们与 5 之间的长度,并将其加入结果列表中。

最终得到的结果列表为 [4, 3, 2, 1, 0]

参考文献:LeetCode 739. Daily Temperatures