力扣496题、503题(单调栈)

496.下一个最大元素I

基本思想:

先对num1中每一个元素他的下一个最大元素对应的写成个字典,

再将num2中每一个元素在字典中找到对应的value放到一个列表中

具体实现:

stack是栈

stack[-1]是列表中最后一个元素

stack.pop()弹出的是最后一个元素--------出栈

stack.append()在列表末尾加入一个元素--------入栈

代码:

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # time O(n), space O(n)
        
        stack = []
        book = {}
        for i in range(len(nums2)):
            while stack and stack[-1] < nums2[i]:
                book[stack.pop()] = nums2[i]
            stack.append(nums2[i])
        
        res = []
        
        for n in nums1:
            if n in book:
                res.append(book[n])
            else:
                res.append(-1)
        
        return res

 

503、下一个最大元素II

基本思想:

将原来的数组复制成双倍大小

具体实现:

i是用来计数的

stack这个栈里存放的是nums中每个元素的下标,不是每个元素

因为要根据下标来修改结果数组res

 

 

 

 

代码:

class Solution(object):
    def nextGreaterElements(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        N = len(nums)
        res = [-1] * N
        stack = []
        for i in range(N * 2):
            while stack and nums[stack[-1]] < nums[i % N]:
                res[stack.pop()] = nums[i % N]
            stack.append(i % N)
        return res

 

posted @ 2021-03-06 18:56  最近饭吃的很多  阅读(90)  评论(0编辑  收藏  举报