📜  在圆形数组中查找下一个更大的元素(1)

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

在圆形数组中查找下一个更大的元素

问题描述

给定一个圆形数组(最后一个元素下一个是第一个元素),要求对数组中的每一个元素求出它的下一个更大的元素。

如果不存在下一个更大的元素,输出 -1。

解决方案

可以通过两次遍历数组来解决这个问题。

第一遍遍历:

  • 维护一个单调递减栈,将数组中的元素入栈。
  • 如果遇到元素大于栈顶元素,说明栈顶元素的下一个更大的元素就是当前元素。
  • 将当前元素入栈。

第二遍遍历:

  • 遍历数组中的元素,如果当前元素在单调递减栈中,则说明它还没有找到下一个更大的元素。
  • 再次遍历数组中的元素,如果当前元素大于栈顶元素,说明当前元素就是栈顶元素的下一个更大的元素。
  • 如果数组中的元素都被遍历了一遍后仍然没有找到下一个更大的元素,说明不存在下一个更大的元素,将数组中相应的元素设为 -1。

最后,返回处理完成的数组。

代码实现
def next_greater_element(nums):
    n = len(nums)
    stack = []
    res = [-1] * n
    for i in range(n*2):
        while stack and nums[stack[-1]] < nums[i % n]:
            res[stack.pop()] = nums[i % n]
        stack.append(i % n)
    return res
性能分析
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$
示例

输入:[1, 2, 3, 4, 5]

输出:[2, 3, 4, 5, -1]

输入:[5, 4, 3, 2, 1]

输出:[-1, 5, 5, 5, 5]