LC 503栈与队列中等第 38 / 95 题

下一个更大元素 II

Next Greater Element II

单调栈循环数组
本机进度仅保存在当前浏览器

题目描述

给定一个循环数组 nums(最后一个元素的下一个元素是数组第一个元素),返回每个元素的下一个更大元素;不存在则输出 -1。

示例:nums = [1, 2, 1],输出 [2, -1, 2]。

解题思路

  1. 循环数组的标准处理:遍历下标 i 取模,总长度扫描 2n 次,模拟"绕圈"。
  2. 单调栈存下标,遇到更大的值就结算栈顶,与线性版一致。
  3. 第二次扫描开始前不清栈:前一轮留在栈中的元素会在第二轮被后续更大元素结算,天然处理跨界查找。

参考实现

查看参考实现Python · 建议先自行作答
def nextGreaterElements(nums):
    n = len(nums)
    ans = [-1] * n
    stack = []
    # 扫描 2n 次模拟循环数组
    for i in range(2 * n):
        x = nums[i % n]
        while stack and nums[stack[-1]] < x:
            ans[stack.pop()] = x
        if i < n:
            stack.append(i)
    return ans

复杂度与归属

时间复杂度O(n)
空间复杂度O(n)
所属分类栈与队列
题源LeetCode 503

关联教程

返回题图鉴