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

原文链接:http://www.cnblogs.com/haylim/archive/2013/02/20/2919774.html

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

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

这个题最快能做到 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

上一篇:Nginx网站使用CDN之后禁止用户真实IP访问的方法


下一篇:java日期大小比较