496.下一个最大元素 python实现

本文介绍了一种使用单调栈解决LeetCode中的'下一个更大元素'问题的方法。通过建立哈希表和动态调整栈,实现在O(M+N)时间内高效找到列表中每个元素的下一个较大值。核心在于利用单调栈数据结构,空间复杂度为O(N)。
摘要由CSDN通过智能技术生成

496. 下一个更大元素 1

“stay hungry stay young
具体的题目描述详见LeetCode,这同样是一道简单题,根据某一元素,求出在列表中离它最近的比它大的元素,通常情况下,可以采取暴力法求解,但当数据过多时,只能采取其他的方法,对于此类问题,有一个较为经典的方法求解,就是采用单调栈的数据结构,依然是“**利用空间换时间“**的思想:

单调栈:

本质上仍然满足栈后进先出的性质,但从栈顶到栈底一定一直保持单调序列,一旦出现不单调的部分,就出栈,栈本身是动态变化的

本题的思路:

对于本题而言,首先我们考虑建立一个哈希表,在python中对应字典的数据结构,每个元素,都对应在num2中下一个比它大的元素,如果没有,返回-1,基于此操作,问题就转化成了如何建立一个dic的问题,这里采用单调栈
当一个元素进栈的时候,首先对栈内元素进行一个判断:

  • 如果当前元素比栈顶元素大,那么栈顶元素出栈,并把栈顶元素和当前元素建立一个映射
  • 如果栈顶元素大于当前想要进栈的元素时,或者栈空,将该元素进栈

基于以上描述,代码如下:

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        stack=[]
        dic={}
        for n in nums2:
            while stack and stack[-1]<n:
                dic[stack.pop()]=n
            stack.append(n)
        return [dic.get(x,-1)for x in nums1]
复杂度分析:

时间复杂度O(M+N) 其中 M 和 N 分别是数组 nums1 和 nums2 的长度。
空间复杂度O(N) 我们在遍历 nums2 时,需要使用栈,以及哈希映射用来临时存储答案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值