leetcode 496.下一个更大元素(单调栈解法)

一、注

如果您还不知道什么是单调栈;如果你想要了解leetcode中单调栈题目的汇总,可以看博主的这篇博客。

       何谓单调栈?leetcode单调栈题目汇总

二、原题

原题链接  496. 下一个更大元素 I

给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1。

 

三、解析

典型的单调栈类型的题目。暂且先不用管nums1,只分析nums2即可。我们所要做的就是对于nums2中的每一个元素k,在nums2中找到k后面第一个比k要大的数。显然可以暴力求解,双重for循环。也可以使用一个单减栈,以[1,3,4,2]为例来分析。我们初始化一个空单减栈min_stack,之后遍历nums

第一个元素1,此时栈为空,将1进栈;

第二个元素3, 此时栈顶元素1小于3,故将1出栈,3进栈;(标记元素1后面第一个大于它的元素是3)

第三个元素4,此时栈顶元素3小于4,将3出栈,4进栈;(标记元素3后面第一个大于它的元素是4)

第四个元素2,此时栈顶元素4大于2,故直接将2进栈。

遍历完后栈中剩余元素4和2,说明在nums2中它们的后面不存在比它们更大的数。 

代码如下:

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 定义一个空哈希表
        d = {}
        min_stack = []  # 定义空的单减栈
        for val in nums2:
            while(min_stack and min_stack[-1] <= val):
                d[min_stack[-1]] = val  # 每次出栈时在哈希表中进行标记
                min_stack.pop()
            min_stack.append(val)
        # 遍历num1中的元素val,若val存在于哈希表中,则返回对应的值,否则返回-1
        return [d.get(val, -1) for val in nums1]

 

你可能感兴趣的:(leetcode刷题)