Leetcode496 下一个更大元素 I

题目链接

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
在这里插入图片描述

代码

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
     	#思路单调栈
        #先计算nums2中每个元素的后面大于它的第一个数,将这样的结果存在一个字典里,也就是d中;
		#然后根据nums1中出现的值去d中查询结果
        d = {
    
    }
        s = []
        n = len(nums2)
        
        #定义结束后,开始对nums2进行单调栈(单调递减)
        #注意!栈中存放的是索引,不是值!!!
        for i in range(n):
        	#对于当前元素来说,如果它大于栈顶,这样就构不成单调递减,
        	#因此将栈顶pop出来,pop出的值的下一个更大元素是当前元素,将这一对映射加到d中
            while s and nums2[i] > nums2[s[-1]]:
                d[nums2[s.pop()]] = nums2[i]
            s.append(i)
        #我们最终得到的单调栈是一个单调递减序列,在栈中存在的每个元素的下一个更大元素都不存在
        for idx in s:
            d[nums2[idx]] = -1
        res = []
        #最后根据nums1中的值去d中查找结果存起来即可
        for num in nums1:
            res.append(d[num])
        return res

备注

1、注意栈中存放的是索引,不是值。
2、这个做法较好理解,但不是最优,空间消耗大
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_45703452/article/details/120968366