《剑指Offer》面试题:实现O(1)获取min的栈

题目

题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
除了有push和pop操作外,还有一个min函数返回栈中的最小值, push,pop和min函数的时间复杂度都要为O(1)。

思路

push和pop操作很明显就是O(1)的时间复杂度,关键是min函数,一般来说,我们求栈中的最小值,会从栈顶开始遍历栈,并设置一个变量Min来保存每次遍历时的最小值 ,遍历到比Min还小的元素,就将该元素赋给Min,但这种方法的时间复杂度为O(n)。
我们可以考虑用空间换时间的思想来提高时间复杂度(很多时候时空均衡都是提高时间复杂度的常规思路),我们另外可以设置一个同样最大深度的栈来保存对应序列的最小值。比如,我们以数组来模拟栈,假设栈A的最大深度为100,目前深度为10,我们就可以另外建立一个栈B,也设它的最大深度为100,另外,让B的前10个元素保存对应位置到栈底位置间元素的最小值,比如,B[3]保存A[3]、A[2]、A[1]、A[0]这几个元素中的最小值,B[2]保存A[2]、A[1]、A[0]这几个元素中的最小值….B[0]则直接保存A[0]的值。这样,我们求栈的最小元素时,直接返回B数组中对应位置的元素值即可。

/*

输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值