算法-最小栈

最小栈是一个特殊的数据结构,具备栈的基本操作如push、pop、top,还提供get_min方法以O(1)时间复杂度获取最小元素。文章探讨了最小栈的实现思路,即通过维护一个额外的变量来保存最小值,并详细解释了如何在push、pop操作中更新这个变量以保持正确性。最后,文章展示了算法的实现和执行结果。
摘要由CSDN通过智能技术生成

什么是最小栈?

最小栈也是一个栈(存的元素都是数字),只不过这种数据结构除了有push、pop、top等和普通栈相同的方法外,还有一个方法get_min用来获取当前栈中的最小元素。

应用场景有哪些?

暂时还没想到

如何实现最小栈,且get_min的时间复杂度为O(1)?

算法思想

首先肯定要有一个变量来保存最小的元素值或者间接的保存最小元素值。
那么这个变量是什么呢?list、dict、还是其他?

一步一步分析,如何才能获取最小值,而且还不影响push、pop、top操作,那么需要保存的数据有两个:

  1. 元素的值(这样pop、push的操作才不会受影响)
  2. 实时的最小元素(这肯定是一个变化的值)

如果保存最小值使用一个数组保存,那么当执行push、pop的时候,这个数组也要相应更新。这样肯定没办法在O(1)的时间复杂度内完成。如果不能直接保存元素,那我们可以保存栈内元素和最小元素之间的关系,这样在执行pop、push的时候进行计算保存,同时有一个变量保存实时的最小值,那么就实现了O(1)时间内获取最小元素。

思路已经说了,该如何实施呢?

  1. 第一次push的时候,把该元素作为最小元素min。
  2. 在后面的push操作中,首先判断当前元素num是否小于min,如果不小于min,就向栈中存入元素值data = num-min(这个值肯定大于0,因为num大于min);如果num小于min,也向栈中存入data = num-min(data小于0),同时记得更新min值。
  3. pop的时候,首先判断栈顶的元素data是否大于0,如果大于0,则pop的值应该是num=data +min(因为存的时候是data = num-min);如果小于0,则pop的时候应该是min,同时要更新min,min = min- data
  4. 同时get_min时直接返回min的值就是整个栈元素中的最小值

算法实现

class MinStack():
    def __init__(self):
        self.stack 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值