如何快速获取队列中的最大值?
最简单的办法,用一个for循环遍历,复杂度为o(n).
解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素。
解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈。
1 class stack 2 { 3 public: 4 stack() 5 { 6 stackTop = -1; 7 maxItemIndex = -1; 8 } 9 void Push(int x)10 {11 stackTop ++;12 if(stackTop >= MAXN) 13 ;14 else15 {16 items[stackTop]=x;17 if(x>Max())18 {19 nextMaxItem[stackTop] = maxItemIndex;20 maxItemIndex = stackTop;21 }22 else nextMaxItem[stackTop] = -1;23 }24 } 25 int Pop()26 {27 int x;28 if(stackTop < 0) return -1;29 else30 {31 x = items[stackTop];32 if(stackTop == maxItemIndex)33 {34 maxItemIndex = nextMaxItem[stackTop];35 }36 stackTop--;37 }38 return x;39 } 40 int Max()41 {42 if(maxItemIndex >= 0) return items[maxItemIndex];43 else return -1;44 } 45 bool empty()46 {47 return stackTop == -1;48 } 49 private:50 int items[MAXN];51 int stackTop;52 int nextMaxItem[MAXN];53 int maxItemIndex;54 };55 class Queue56 {57 public:58 void Enqueue(int x)59 {60 B.Push(x);61 } 62 int Dequeue()63 {64 if(A.empty())65 {66 while(!B.empty())67 {68 A.Push(B.Pop());69 }70 }71 return A.Pop();72 } 73 int Max()74 {75 if(A.Max() >= B.Max()) return A.Max();76 else return B.Max();77 } 78 private:79 stack A;80 stack B;81 };