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 @   BJFU-VTH  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示