编程之美---队列中取最大值操作问题
2014-12-13 11:17
281 查看
如何快速获取队列中的最大值?
最简单的办法,用一个for循环遍历,复杂度为o(n).
解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素。
解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈。
View Code
最简单的办法,用一个for循环遍历,复杂度为o(n).
解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素。
解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈。
class stack { public: stack() { stackTop = -1; maxItemIndex = -1; } void Push(int x) { stackTop ++; if(stackTop >= MAXN) ; else { items[stackTop]=x; if(x>Max()) { nextMaxItem[stackTop] = maxItemIndex; maxItemIndex = stackTop; } else nextMaxItem[stackTop] = -1; } } int Pop() { int x; if(stackTop < 0) return -1; else { x = items[stackTop]; if(stackTop == maxItemIndex) { maxItemIndex = nextMaxItem[stackTop]; } stackTop--; } return x; } int Max() { if(maxItemIndex >= 0) return items[maxItemIndex]; else return -1; } bool empty() { return stackTop == -1; } private: int items[MAXN]; int stackTop; int nextMaxItem[MAXN]; int maxItemIndex; }; class Queue { public: void Enqueue(int x) { B.Push(x); } int Dequeue() { if(A.empty()) { while(!B.empty()) { A.Push(B.Pop()); } } return A.Pop(); } int Max() { if(A.Max() >= B.Max()) return A.Max(); else return B.Max(); } private: stack A; stack B; };
View Code
相关文章推荐
- 编程之美-队列中取最大值操作问题
- 【编程之美】3.7 队列取最大值操作问题 ☆
- 读书笔记之编程之美 - 3.7 队列中取最大值操作问题
- 编程之美--3.7 队列中取最大值操作问题
- 编程之美-3.7-队列中取最大值操作问题
- 编程之美 set 10 队列中取最大值操作问题
- [编程之美] PSet3.7 队列中取最大值操作问题
- 编程之美-队列中取最大值操作问题
- 编程之美3.7队列中取最大值操作问题(新解法,空间复杂度比原解法低)
- 队列中取最大值操作问题
- 编程之美3.7——队列中取最大值操作问题
- 编程之美读书笔记_3.7_队列中取最大数操作问题
- 编程之美 队列中取最大值操作
- 《编程之美》读书笔记18: 3.7 队列中取最大数操作问题
- 编程之美3.7,队列中的最大值操作问题
- 队列中取最大值操作问题
- 队列中取最大值操作问题
- 队列中取最大值操作问题
- 队列中取最大值操作问题
- 编程之美——队列中取最大值操作问题