实现一堆栈,要求三个操作,Pop,Push,GetMaxValue,时间均为O(1)

今天有哥们考我一道算法题:

哥们: 实现一个堆栈,可以任意的入栈,出栈

偶: 这很简单啊,用顺序结构还是链式结构都可以。不过既然是任意的,那就用链式结构好了。算偶过关。窃喜。

哥们:同样要求实现一个堆栈,实现三个接口,Pop(), Push(), GetMaxValue(), 要求时间复杂度均为O(1)

偶:很简单啊。 额外分配一个空间,记录最大制,每次Pop,Push的时候,维护这个最大值就可以了。

哥们: 那怎么维护呢。比如Push()的时候,Pop()的时候。。。?

偶:Push的时候,Push值和已知最大值比较,有必要的话交换。Pop的时候,Pop的时候,Pop的时候。。。

哥们:如果Pop的是现在的最大值怎么处理?

偶:。。。

 

又思考若干时间:

还没有思路,但感觉能达到Get的时候取值为O(1)的,就只有Hashtable了。最终未解。

哥们:为了满足时间,牺牲点空间也无所谓。考虑下面的结构

偶:恍然大悟。。。。遂奉上冰棍一个,以示感谢。

偶:如果把辅助站的内容精简下呢,比如有重复的,只存一个如何?

哥们:假如现在我遇到数据栈中的200要出栈,那辅助站中的200是否出栈呢?

偶:。。。恍然大悟

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值