九章算法——队列上实现Min方法
来源:互联网 发布:ubuntu 拼音 乱套了 编辑:程序博客网 时间:2024/04/28 13:59
昨天在九章算法上看到的一个问题:
在栈上实现Min方法,由于栈后入先出的特点,实现Min方法很容易想到同时维护一个minValue的栈,栈顶元素保持是normal stack中所有元素的min value,现在问如何在队列上实现一个Min方法,要求,队列除了支持基本的push(x),pop()方法以外,还需支持min方法,返回当前队列中的最小元素,每个方法的均摊复杂度为O(1)。
思考过程:
容易实现在push新元素后更新当前min值,但如何在pop队首元素后保证紧接着的min调用是难点,想着想着,想到同时维护一个保存minValue的队列,维持队列内的仅存放所有的minValue:
template <typename T>class MinQueue{private:queue<T> normalQueue;queue<T> minValueQueue;public:bool empty()const{return normalQueue.empty();}void push(const T& item){normalQueue.push(item);if(minValueQueue.empty()){minValueQueue.push(item);}else if(minValueQueue.front() > item){while(!minValueQueue.empty()) minValueQueue.pop();minValueQueue.push(item);}else if(minValueQueue.front() == item){minValueQueue.push(item);}}T pop(){T tmp = normalQueue.front();normalQueue.pop();if(tmp == minValueQueue.front()){minValueQueue.pop();}return tmp;}T min(){return minValueQueue.front();}};很容易看出min方法是O(1)的,pop方法也是O(1)的,push方法中包含一个while循环,一次操作中有可能不是O(1)的,但由于所有元素最多一进一出minValueQueue,所以其均摊开销是O(1)的。
PS:总感觉这个思想有点像单调队列,只不过这里仅存储了最小值……
0 0
- 九章算法——队列上实现Min方法
- 九章算法面试题50 队列上实现Min函数
- 九章算法面试题23 栈上实现Min函数
- Min-Min算法实现
- 九章算法面试题49 用栈实现队列
- Max-Min算法实现
- 算法导论(min-priority-queue 最小优先队列的部分实现)
- 算法系列——Min Stack
- 九、STL算法-不变序列算法(find、count、min、for_each)
- 【老鸟学算法】包含 min函数的栈设计——java实现
- 【坐在马桶上看算法】算法11:堆——神奇的优先队列(上)
- LeetCode 之 Min Stack — C++ 实现
- 9.3栈和队列(三)——设计一个栈,出pop与push方法,还支持 min方法,可返回栈元素中的最小值
- 【算法】解密 QQ 号——使用队列的方法
- 算法导论—队列
- 啊哈!算法—队列
- 【啊哈!算法】算法11:堆——神奇的优先队列(上)
- 【坐在马桶上看算法】算法4:队列——解密QQ号
- 碰到写xml文件的一个错误
- cocos2dx内存管理
- sublinetext使用代码格式化的问题
- 每天一个JavaScript实例-防止重复表单提交
- EhCache和Spring的结合使用
- 九章算法——队列上实现Min方法
- c++知识汇总(未完待续)
- yii2安装(windows)
- 构建高速缓存
- MAC 升级到10.10(OS X Yosemite)下apache+php的配置问题
- 十月上旬百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题)
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element
- Woody的Python学习笔记2
- 欢迎访问我的博客www.smallqingcai.com