503. 下一个更大的元素II

链接

https://leetcode.cn/problems/next-greater-element-ii/description/

思路

我在单调栈这块是真的不会......稍微一变就想不明白了, 得找个时间攻克一下

这个题目,我能想到的办法就是把数组拉长到2倍(模拟循环数组),然后对其进行单调栈处理

首先,我们要求的是下一个更大的元素,所以单调栈应该是递减的。

之所以这个题目可以从前往后遍历, 是因为这是个循环数组(我猜测是这样的,我真的想不懂...)

但更符合思路的,显然是从后往前遍历了!

代码一:从前往后遍历

class Solution:
    def nextGreaterElements(self, nums):
        if not nums:
            return []
        # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比
        res = [-1 for i in nums+nums[:-1]]
        single_stack = []
        # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比
        new_nums = nums + nums[:-1]
        for i, v in enumerate(new_nums):
            while single_stack and new_nums[single_stack[-1]] < new_nums[i]:
                top_val_index = single_stack.pop()
                res[top_val_index] = new_nums[i]
            single_stack.append(i)
        return res[:len(nums)]

 代码二:从后往前遍历(更符合我的思维习惯)

class Solution:
    def nextGreaterElements(self, nums):
        if not nums:
            return []
        # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比
        res = [-1 for i in nums+nums[:-1]]
        single_stack = []
        # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比
        new_nums = nums + nums[:-1]
        # 果然, 倒着遍历好想多了....
        for i in range(len(new_nums)-1, -1, -1):
            while single_stack and new_nums[single_stack[-1]] <= new_nums[i]:
                single_stack.pop()
            if single_stack:
                res[i] = new_nums[single_stack[-1]]
            single_stack.append(i)
        return res[:len(nums)]

 

posted @ 2023-10-09 10:42  BJFU-VTH  阅读(3)  评论(0编辑  收藏  举报