美文网首页
Python数据结构-单调栈(Monotone Stack)

Python数据结构-单调栈(Monotone Stack)

作者: ShowMeCoding | 来源:发表于2022-01-19 15:47 被阅读0次

一、单调栈

一种特殊的栈,在栈的「先进后出」规则基础上,要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。

单调递增栈:只有比栈顶元素小的元素才能直接进栈,否则需要先将栈中比当前元素小的元素出栈,再将当前元素出栈。结果:从栈顶到栈底的元素值是单调递增的。

单调自减栈:只有比栈顶元素大的元素才能直接进栈,否则需要先将栈中比当前元素大的元素出栈,再将当前元素入栈。

二、单调栈适用场景

单调栈可以在时间复杂度为O(n)的情况下,求解出某个元素左边或者右边第一个比它大或者小的元素。

口诀
查找 「比当前元素的元素」 就用 单调递增栈,查找「比当前元素的元素」就用 单调递减栈
从 「左侧」 查找就看 「插入栈」 时的栈顶元素,从 「右侧」 查找就看 「弹出栈」 时即将插入的元素。

二、代码模板

  • 单调递增栈模板(栈底到栈顶单调递增)
def IncreasingStack(nums):
    stack = []
    for num in nums:
        # 当前值大于栈顶元素,将栈顶元素弹出
        while stack and num >= stack[-1]:
            stack.pop()
        stack.append(num)
  • 单调递减模板(栈底到栈顶单调递减)
def DecreasingStack(nums):
    stack = []
    while stack and num <= stack[-1]:
        stack.pop()
    stack.append(num)
496. 下一个更大元素 I

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
  • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        res = []
        stack = []
        # 存储内容 元素:下一个更大元素
        mapping = {}  
        # 遍历nums2 ,创建单调递增栈
        for num in nums2:
            while stack and num > stack[-1]:
                mapping[stack[-1]] = num
                stack.pop()
            stack.append(num)
        for num in nums1:
            if num in mapping:
                res.append(mapping[num])
            else:
                res.append(-1)
        return res
739. 每日温度

请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        res = [0]*n
        # 栈用来存储更大元素的索引位置
        stack = []
        for i in range(n):
            # 单调递增栈
            while stack and temperatures[i] > temperatures[stack[-1]]:
                index = stack.pop()
                res[index] = i - index
            stack.append(i)
        return res

相关文章

  • Python数据结构-单调栈(Monotone Stack)

    一、单调栈 一种特殊的栈,在栈的「先进后出」规则基础上,要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)...

  • 1.单调栈

    一、单调栈定义 单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的...

  • 使用单调栈解决 “下一个更大元素” 问题

    前言 大家好,我是小彭。 今天分享到一种栈的衍生数据结构 —— 单调栈(Monotonic Stack)。栈(St...

  • LintCode 495 [Implement Stack]

    原题 实现一个栈,可以使用除了栈之外的数据结构 样例 解题思路 使用python list实现stack数据结构 ...

  • Python实现队列,栈

    通过python设计实现队列以及栈,复习一下数据结构 队列:先进先出 class Stack(object):de...

  • 单调栈

    所谓单调栈是使用stack来保存一组单调递增或递减的数据,遇到非单调的数据则出栈。具体参加leetcode 739...

  • 数据结构——Golang实现堆栈

    转载请注明出处数据结构——Golang实现堆栈 1. 栈(stack) 栈(stack)在计算机科学中是限定仅在表...

  • 6.Stack子类(Vector子类 了解)

    Stack表示的是栈操作,栈是一种先进后出的数据结构,而Stack是Vector的子类。public class ...

  • python 中的栈

    python 是没有栈的,我们可以模拟一个栈 stack通常的操作: Stack() 建立一个空的栈对象push(...

  • Java算法和数据结构概述

    一、数据结构 1、常见数据结构:Array(数组)、Stack(栈)、Queue(队列)、LinkedList(链...

网友评论

      本文标题:Python数据结构-单调栈(Monotone Stack)

      本文链接:https://www.haomeiwen.com/subject/tlrrhrtx.html