标签:style blog http ar color os 使用 sp for
如何快速获取队列中的最大值?
最简单的办法,用一个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 else 15 { 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 else 30 { 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 Queue 56 { 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 };
标签:style blog http ar color os 使用 sp for
原文地址:http://www.cnblogs.com/wen-ge/p/4161099.html