JZX轻语:简

LeetCode 503 - 下一个更大元素II

发表于2024年06月24日

#单调栈

单调栈模板题,差异点在于循环数组。我们可以将数组复制一份,然后将其拼接到原数组的后面,这样就可以将循环数组转化为普通数组。然后按照单调栈的模板进行处理即可。

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        ans = [-1] * len(nums)
        stack = []
        for i in range(len(nums) * 2):
            num = nums[i % len(nums)]
            while stack and nums[stack[-1] % len(nums)] < num:
                ans[stack[-1] % len(nums)] = num
                stack.pop()
            stack.append(i)
        return ans

可以考虑优化点:两次循环列表(其中第二次循环不再将元素加入到栈中),当第二次循环时,栈顶元素的位置小于等于当前位置时,意味着栈内所有的元素(其位置必然均小于等于栈顶元素的位置)已经找不到更大的元素,直接跳出循环即可。缺点是需要多写一次循环的代码。

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        ans = [-1] * len(nums)
        stack = []
        # 第一次循环就是单调栈的模板
        for i, num in enumerate(nums):
            while stack and nums[stack[-1]] < num:
                ans[stack[-1]] = num
                stack.pop()
            stack.append(i)

        # 第二次循环本质是找栈内剩余元素的下一个更大元素,这个更大元素位置如存在,必然在左边
        for i, num in enumerate(nums):
            if not stack or stack[-1] <= i:
                break
            while stack and stack[-1] > i and nums[stack[-1]] < num:
                ans[stack[-1]] = num
                stack.pop()

        return ans

闪念标签:LC

题目链接:https://leetcode.cn/problems/next-greater-element-ii/