(一)设计包含min函数的栈

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

 

分析:普通的栈push(),pop()都是O(1),现在需要加入min方法。第一眼看这个题,想到在栈结构中加一个min变量,保存当前栈最小元素。这样在push()操作时比较当时元素与min变量值来决定是否要替换min变量,即push()操作O(1),但是pop()的时候最有麻烦,因为如果pop()的是最小元素,那更新min变量就需要重新遍历整个栈,时间复杂为O(n)。如果继续按上面思路想下去,再加一个次小变量仍然解决不了pop()时更新的问题。所以需要定义一个辅助栈存当前栈中的最小值,也就是需要一个是正常的数据栈,一个是存放最小元素的辅助栈。push的时候,如果辅助栈为空,则直接把当前元素压入辅助栈。否则比较当前元素值与辅助栈顶元素值(即之前最小值),取最小者压入栈。pop的时候与数据栈同时。最后提一个优化的地方,辅助栈可以不保存数据本身,而是只保存数据在数据栈的索引,这样可以减少内存使用。下面的实现使用STL的stack,没有办法用迭代器访问stack中间元素,所以辅助栈保存数据本身而并非索引。

 

C++实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值