九章算法——队列上实现Min方法
2014-10-21 12:51
375 查看
昨天在九章算法上看到的一个问题:
在栈上实现Min方法,由于栈后入先出的特点,实现Min方法很容易想到同时维护一个minValue的栈,栈顶元素保持是normal stack中所有元素的min value,现在问如何在队列上实现一个Min方法,要求,队列除了支持基本的push(x),pop()方法以外,还需支持min方法,返回当前队列中的最小元素,每个方法的均摊复杂度为O(1)。
思考过程:
容易实现在push新元素后更新当前min值,但如何在pop队首元素后保证紧接着的min调用是难点,想着想着,想到同时维护一个保存minValue的队列,维持队列内的仅存放所有的minValue:
PS:总感觉这个思想有点像单调队列,只不过这里仅存储了最小值……
在栈上实现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:总感觉这个思想有点像单调队列,只不过这里仅存储了最小值……
相关文章推荐
- 九章算法面试题49 用栈实现队列
- 循环队列的实现与分析,两种方法,算法导论10.1-4
- 九章算法面试题50 队列上实现Min函数
- C++数据结构与算法之双缓存队列实现方法详解
- lintcode&九章算法——Lintcode No.40 用栈实现队列 ? 待解决
- 要求顺序循环队不损失一个空间,全部能够得到有效利用,试采用设置标志位tag的方法解决“假溢出”问题,实现顺序循环队列算法
- nachos 3.4 实现抢占式多级队列反馈算法
- 基于AR模型谱估计算法(Yule-Walker方法与Burg方法)的C++实现
- CRC算法原理及C语言实现(介绍了3种方法)
- 复习:支持向量机的理论基础—学习算法的实现方法
- C#数据结构和算法学习系列七----队列、队列的实现和应用
- 无向图的最短路径算法(队列实现 )
- 数值计算方法与算法:C语言实现利用Gauss消元法解方程组
- 每天学习一算法系列(31)(实现一个队列,队列的应用场景为:一个生产者线程将int 类型的数入列,一个消费者线程将int 类型的数出列)
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- 用VB实现循环队列算法收藏
- 我的本科毕业设计(非水文,设计了一个新算法):一种字符编码猜测工具的实现方法
- 图的基本算法实现(邻接矩阵与邻接表两种方法)
- 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)