漫画算法:最小栈的实现
转载自 玻璃猫 程序员小灰
小灰回忆起当时的情景……
题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
小灰的想法:
1.创建一个整型变量 min,初始值-1
2.当第一个元素进栈时,让min=0,即把唯一的元素当做最小值。
3.之后每当一个新元素近栈,让新元素和min指向位置的元素比较大小。如果Stack[min]大于新元素,则min等于新元素的下标;Stack[min]小于新元素,则不做改变。
4.当调用getMin方法的时候,直接返回min所指向位置的元素即可。
按这个思路,近栈、出栈、取最小值的时间复杂度都是O(1),空间复杂度也是O(1)。
回忆到此结束……
解法:
1.设原有的栈叫做栈A,此时创建一个额外的栈B,用于辅助原栈A。
2.当第一个元素进入栈A的时候,让新元素的下标进入栈B。这个唯一的元素是栈A的当前最小值。(考虑到栈中元素可能不是类对象,所以B栈存储的是A栈元素的下标)
3.每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。
4.每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素成为了栈A的当前最小值。(备胎转正)
5.当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。
这个解法中近栈、出栈、取最小值的时间复杂度都是O(1),最坏情况空间复杂度是O(N)。
扩展题目:
实现一个队列,带有出队(deQueue),入队(enQueue),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都尽可能小。
小灰回忆起当时的情景……
题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。
小灰的想法:
1.创建一个整型变量 min,初始值-1
2.当第一个元素进栈时,让min=0,即把唯一的元素当做最小值。
3.之后每当一个新元素近栈,让新元素和min指向位置的元素比较大小。如果Stack[min]大于新元素,则min等于新元素的下标;Stack[min]小于新元素,则不做改变。
4.当调用getMin方法的时候,直接返回min所指向位置的元素即可。
按这个思路,近栈、出栈、取最小值的时间复杂度都是O(1),空间复杂度也是O(1)。
回忆到此结束……
解法:
1.设原有的栈叫做栈A,此时创建一个额外的栈B,用于辅助原栈A。
2.当第一个元素进入栈A的时候,让新元素的下标进入栈B。这个唯一的元素是栈A的当前最小值。(考虑到栈中元素可能不是类对象,所以B栈存储的是A栈元素的下标)
3.每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。
4.每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素成为了栈A的当前最小值。(备胎转正)
5.当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。
这个解法中近栈、出栈、取最小值的时间复杂度都是O(1),最坏情况空间复杂度是O(N)。
扩展题目:
实现一个队列,带有出队(deQueue),入队(enQueue),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都尽可能小。
漫画算法:最小栈的实现相关推荐
- 每天Leetcode 刷题 初级算法篇-设计问题-最小栈
题目要求: 力扣题解: 代码 /*** @program: mydemo* @description: 设计问题-最小栈* @author: Mr.zeng* @create: 2021-02-19 ...
- 【算法】剑指offer-删除链表中重复的节点最小栈
文章目录 删除链表中重复的节点 最小栈 删除链表中重复的节点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例 如,链表1->2->3- ...
- 招行算法2020届实习技术面编程题:实现O(1)最小栈(手撸代码)
何为最小栈?栈最基础的操作是压栈(push)和退栈(pop),现在需要增加一个返回栈内最小值的函数(get_min),要求get_min函数的时间复杂度为o(1).python的栈肯定是使用list实 ...
- 《漫画算法》读书笔记
<漫画算法>读书笔记 在图书馆借阅算法书时,看到了一本非常吸引我的算法书--<漫画算法>.算法还能以漫画的方式展示出来吗?我带着我的疑惑翻开了这本书,里面的语言非常接地气,通俗 ...
- 漫画算法-小灰的算法之旅-排序算法(四)
本文内容基于<漫画算法 小灰的算法之旅>,魏梦舒著. 1. 分类 1.1 时间复杂度为O(n^2)的排序算法 1.2 时间复杂度为O(nlogn)的排序算法 1.3 时间复杂度为线性的排序 ...
- 《漫画算法》读书心得笔记-未完
感谢FunTester送的书籍.建议大家买或借来看看,一起学习下.本文主要是记录我看这本书的心得,不一定理解是对的,是我自己悟出来的体会,而不是按书照抄,都是凭自己的理解写出来的,相当于在写一本书了, ...
- 程序员小灰的漫画算法和知识总结,高品质强推!!!
转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载. 漫画知识汇总 漫画:深度优先遍历 和 广度优先遍历 漫画:什么是 "图"?(修订版) 漫画:图的 "最短路径 ...
- 程序员小灰的漫画算法
算法 漫画:什么是ConcurrentHashMap? 漫画:高并发下的HashMap 漫画:什么是HashMap? 漫画:什么是红黑树? 什么是AES算法?(整合版) 漫画:什么是SHA系列算法? ...
- 漫画算法:什么是 B+ 树?
https://mp.weixin.qq.com/s/QGepgMbHQ8JeRxVQwAwsxQ 漫画算法:什么是 B+ 树? 2017-07-14 程序员的那些事 (点击上方公众号,可快速关注) ...
- 【读书笔记】《漫画算法》:克服对算法的恐惧,从漫画开始
写在开头 在上小学和初高中的时候,要我写读后感这种东西,我是非常厌恶的.无非就是老师布置的一个作业,还是那种无趣且磨人的工作. 结果十多年过去了,到了工作的年纪,看书反倒是自觉地写起读后感来了,而且居 ...
最新文章
- 基于Pytorch再次解读NiN现代卷积神经网络和批量归一化
- CSS属性display:inline-block使用揭秘
- OpenSceneGraph学习笔记
- linux0775权限,Linux权限管理
- 一篇文章学会Python函数重写,每天进步一个知识点
- 继承ViewGroup:重写onMeasure方法和onLayout、requestlayout方法
- 吉他谱----see you again
- VSCode 实时预览HTML网页效果 - Live Server插件
- Mac使用工具tree,打印项目目录树到Markdown
- “春风又绿江南岸”真正的关键是什么?
- php树递归算法,PHP二叉树递归算法
- java for冒号_浅谈对Java双冒号::的理解
- The following error occured:
- 线上故障等级和处理规范,看阿里测试工程师如何拿捏
- 小暑将至,这组小暑海报送给你们
- “小智特惠” Android版已经登录各大电子市场,欢迎试用
- ASP.NET搜索引擎
- 6-DoF问题相关基础知识笔记
- VM15.5虚拟机安装openwrt系统作为旁路由
- 2023东北农业大学计算机考研信息汇总
热门文章
- 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。
- matlab求logistics映射 的le_高维映射 与 核方法(Kernel Methods)
- 经典排序算法(3)——直接插入排序算法详解
- HDU - 6967 G I love data structure 线段树维护矩阵 + 细节
- Codeforces Round #590 (Div. 3) E. Special Permutations 差分 + 思维
- P2446 [SDOI2010]大陆争霸
- 牛客题霸 [ 树的直径] C++题解/答案
- Matrix Subtraction(小米icpc邀请赛第一场)
- AtCoder ZONe Energy Programming Contest 题解
- P3577-[POI2014]TUR-Tourism【状压dp】