第九题:【数据结构】【微软面试题】假设我们有一个队列 我们需要快速的找到里面存储的最大值 该怎么做?...

假设我们有一个队列  我们需要快速的找到里面存储的最大值 该怎么做?

【提示】:你能做到多快,队列不能排序哦

这个题最快能做到 O(1)
当然 需要采用空间换时间的方法 那么如何换呢?

现在 我们用在之前的用2个栈实现的队列中  再增加两个栈 新增加的两个栈分别的栈顶分别用来表示 原有的两个数据栈中的元素的最大值 现在我们定义  sd1 为队列的进入栈  sd2 为队列的弹出栈 sdm1 为sd1的最大值栈 sdm2 为sd2的最大值栈

每次进栈的时候 我们再把数据压入sd1前 先比较sdm1的栈顶元素 如果待压入的数据大, 那么我们就把这个数据压入sdm1 如果sdm1的栈顶数据大 那么我们将这个栈顶数据再次压入sdm1

当有数据从sd1中弹出的时候  sdm1也同时弹出一个数据

这样, sdm1的栈顶总是当前sd1中所有数据的最大值

对于sd2和sdm2也用同样的处理方法

之后我们如果要获取 整个队列的最大值  我们值需要对比sdm1和sdm2的栈顶元素就可以了  大的就是整个队列的最大值了

时间复杂度O(1)

比如: 
sd1: 5   栈顶 5
sdm1: 5  栈顶 5
现在压入: 4
sd1:4,5  栈顶 4
sdm1:5,5 栈顶 5
弹出后:
sd1: 5   
sdm1: 5  

转载于:https://www.cnblogs.com/haylim/archive/2013/02/20/2919774.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值