设计包含min函数的栈

本文探讨如何设计一个栈,使其在push、pop操作的同时,min函数获取最小元素的时间复杂度为O(1)。初始方案使用辅助栈记录最小值,但存在时间和空间消耗问题。改进方案利用原栈中数组的随机访问特性,仅记录最小元素位置,降低空间和时间复杂度。对于相等元素,需考虑重复计数或标记。
摘要由CSDN通过智能技术生成

设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。

解析:push和pop都可以做到时间复杂度为O(1),则函数min是关键,如果仅是用一个变量来记录当前最小值,一旦这个最小值被pop出去,便找不到剩下所有变量中的最小值了。

我们需要一个辅助栈来记录,原数据栈中按照后进先出的原则,而辅助栈则将数据按照顺序进栈,最小值在栈顶。

举例:



通过举例我们容易看到这个方法还是有一定不足的。1、辅助栈总是在添加新元素时会改变元素的顺序,会间接增加时间的消耗,最坏情况是全部出栈,把新push元素放入栈底,然后再全部入栈,为O(2N);2、如果数据的结构比较复杂,则会增加空间的消耗。


改进:

如果栈是以数组的方式存储的话,我们知道数组的随机访问时间复杂度为O(1),那么我们只需要记录最小元素在原栈中的位置,由于栈后进先出的特点,如果新push的元素比最小元素小,则需记录该元素位置,如果新push元素比最小元素大,则辅助栈push的元素是最小元素位置的大小。

举例:


这样一来,空间复杂度降低了,时间复杂度也降低了。

从 5.push 6      5,7,1,3,0   0,0,2,2,41可以看出辅助栈中多了很多不需要的空间,0和2都有重复。

如果入栈的元素都不相等,那么可以省略重复的部分,在步骤5辅助栈中应该是0 2 4,当出栈元素是最小元素时,辅助栈才出栈。

如果入栈有相等的元素,那么辅助栈需要有相等的元素或者其他标记来记录重复的个数。


继续改进:

如果不能用辅助栈呢?我们来定义一个数据结构

template <typename T> class MinStack

{


private:

    T m_data;

    class MinStack * m_minLink;

};


当新push元素大于最小元素时,放在链表尾端,如果新push元素小于最小元素时,需要将最小元素放在链表首位。pop时等同于删除链表中的一个节点。
这个方法虽然省略了辅助栈,但复杂了数据的结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值