首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在O(1)内找到实时序列的最小值?

如何在O(1)内找到实时序列的最小值?

作者头像
double
发布于 2021-05-07 02:12:56
发布于 2021-05-07 02:12:56
77200
代码可运行
举报
文章被收录于专栏:算法channel算法channel
运行总次数:0
代码可运行

最小栈

最小栈,能在O(1)内找到栈内序列的最小值,因此此特性经常用于提升算法性能。下面看看它的一种实现。

分析过程

  1. 入栈分析:

推入元素到 mainstack,只有当当前元素小于tmpstack栈顶(实际存储为mainstack中元素索引)元素时,才入栈到tmpstack,入栈的是索引。

假设mainstack当前有n个元素,则tmpstack内元素至多有n个。等于n时,表明原入栈序列为单调递减序列。

  1. 出栈分析:

元素从mainstack出栈,但要注意出栈元素索引是否等于tmpstack栈顶,若是需要将tmpstack栈顶元素出栈。可以预知,栈顶索引一定小于等于出栈元素(在mainstack栈内)的索引。

这道题需要注意两点:

  1. 临时栈里推送的是主栈的元素索引
  2. push时若临时栈为空,需要先推入此元素在主栈索引

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MinStack(object):
    def __init__(self):

        """
        initialize your data structure here.
        """
        self.mainstack= []
        self.tmpstack = []

推入元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def push(self, val):

        """
        :type val: int
        :rtype: None
        """

        self.mainstack.append(val)

        if not self.tmpstack:

            self.tmpstack.append(len(self.mainstack)-1)

        # smaller than top of tmpstack
        if self.mainstack[self.tmpstack[-1]] > val:

            self.tmpstack.append(len(self.mainstack)-1) 

出栈元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def pop(self):
        """
        :rtype: None
        """

        # min val of tmp stack equals top of mainstack
        if self.tmpstack and self.tmpstack[-1] == len(self.mainstack)-1:
            self.tmpstack.pop()

        return self.mainstack.pop()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   def top(self):
       """
       :rtype: int
       """

       if self.mainstack:
           return self.mainstack[-1]

使用tmpstack辅助栈,换来了O(1)的查询最小复杂度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def getMin(self):
        """
        :rtype: int
        """

        if self.tmpstack:
            return self.mainstack[self.tmpstack[-1]]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法:栈
简单来说,栈是一种 「后进先出(Last In First Out)」 的线性表,简称为 「LIFO 结构」。可以从两个方面来解释一下栈的定义:
用户3578099
2022/03/15
7170
算法:栈
【Java数据结构】详解Stack与Queue(二)
除此之外我们还可以用另一种特殊方法,就是利用栈去打印,代码展示在这。相比递归其更高效。
E绵绵
2024/06/04
1330
【Java数据结构】详解Stack与Queue(二)
LeetCode 155:最小栈 Min Stack
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
爱写bug
2019/08/02
5060
Day5-线性表-栈-最小栈问题
而且今天本来按照之前说的,应该更两篇的,但是今天只有一篇盒饭,还不是因为最近需求排的紧,加班加点干活,大哥们见谅
BUPTrenyi
2019/07/16
3460
Day5-线性表-栈-最小栈问题
算法图解:如何找出栈中的最小值?
前面我们学习了很多关于栈的知识,比如《动图演示:手撸堆栈的两种实现方法!》和《JDK 竟然是这样实现栈的?》,那么接下来我们再来刷一些关于栈的经典面试题以巩固学过的知识。
磊哥
2020/10/26
1.6K0
算法图解:如何找出栈中的最小值?
LeetCode,Go 实现最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
微客鸟窝
2021/08/18
2680
LeetCode,Go 实现最小栈
最小栈 与 栈的压入、弹出序列
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
初阶牛
2023/10/14
2340
最小栈 与 栈的压入、弹出序列
Q155 Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum element
echobingo
2018/04/25
4820
【C++】STL--stack
后进先出(LIFO):Stack容器遵循后进先出的原则,即最后进入栈的元素最先被移出栈。
用户11375356
2024/11/22
960
【C++】STL--stack
算法刷题笔记03:Stack、Queue
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
Hsinyan
2022/08/30
2940
算法刷题笔记03:Stack、Queue
用javascript分类刷leetcode17.栈(图文视频讲解)4
目录Stack的特点:先进后出(FILO)使用场景:十进制转2进制 函数调用堆栈js里没有栈,但是可以用数组模拟 42/2 42%2=0 21/2 21%2=1 10/2 10%2=0 5/2 5%2=1 2/2 2%2=0 1/2 1%2=1 stack: 0,1,0,1,0,1 res: 1 0 1 0 1 0 fn1(){fn2() } fn2(){ fn3()} fn3(){} fn1() stack:fn1,fn2,fn3栈的时间复杂度:入栈和出栈O
js2030code
2023/01/06
3650
【小Y学算法】⚡️每日LeetCode打卡⚡️——41. 最小栈
设计一个支持 push ,pop,top操作,并能在常数时间内检索到最小元素的栈。
呆呆敲代码的小Y
2021/09/29
2770
【小Y学算法】⚡️每日LeetCode打卡⚡️——41. 最小栈
ACM金牌选手讲解LeetCode算法《线性表》
LeetCode刷题过程中,常常用到的线性表主要包括以下四个重要的数据结构: 数组、链表、栈、队列。
编程熊
2021/07/21
6730
ACM金牌选手讲解LeetCode算法《线性表》
LeetCode 155. 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
freesan44
2020/03/20
2810
☆打卡算法☆LeetCode 155. 最小栈 算法解析
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
恬静的小魔龙
2022/08/07
3320
☆打卡算法☆LeetCode 155. 最小栈 算法解析
155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 * * push(x) —— 将元素 x 推入栈中。 * pop() —— 删除栈顶的元素。 * top() —— 获取栈顶元素。 * getMin() —— 检索栈中的最小元素。
名字是乱打的
2021/12/23
1920
数据结构与算法(2)——栈和队列栈队列LeetCode 相关题目整理其他题目整理
栈是一种用于存储数据的简单数据结构(与链表类似)。数据入栈的次序是栈的关键。可以把一桶桶装的薯片看作是一个栈的例子,当薯片做好之后,它们会依次被添加到桶里,每一片都会是当前的最上面一片,而每次我们取的时候也是取的最上面的那一片,规定你不能破坏桶也不能把底部捅穿,所以第一个放入桶的薯片只能最后一个从桶里取出;
我没有三颗心脏
2018/07/24
1.3K0
搞定大厂算法面试之leetcode精讲17.栈
搞定大厂算法面试之leetcode精讲17.栈 视频讲解(高效学习):点击学习 目录: 1.开篇介绍 2.时间空间复杂度 3.动态规划 4.贪心 5.二分查找 6.深度优先&广度优先 7.双指针 8.滑动窗口 9.位运算 10.递归&分治 11剪枝&回溯 12.堆 13.单调栈 14.排序算法 15.链表 16.set&map 17.栈 18.队列 19.数组 20.字符串 21.树 22.字典树 23.并查集 24.其他类型题 Stack的特点:先进后出(FILO) 使用场景:十进制转2进制 函数调用
全栈潇晨
2021/12/03
3700
LeetCode-155-最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
benym
2022/07/14
2380
Leetcode No.155 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
week
2021/05/06
2880
相关推荐
算法:栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验