【数据结构和算法】 O(1)时间取得栈中的最大 / 最小元素值
2014-04-17 14:21
429 查看
常数时间取得栈中的元素最大值和最小值,我们可以想到当push的时候比较一下,如果待push元素值小于栈顶元素,则更新min值,最大值亦然。
这样有个问题就是当pop的时候,就没了最大最小值。
于是上网查,方案余下:
转自 http://blog.163.com/kevinlee_2010/blog/static/169820820201092091554523/
感谢原作者! 转载此文请保留原作者链接!
/*********************转载 开始**************************/
问题描述:
对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。
解决方案:
在栈的每个元素加一个属性值 min (用于记录当前位置下面的元素的最小值),元素的值用key表示
压栈-Push:当压入的元素key小于当前栈顶元素的min值时,将新压入元素的min字段设置为新压入元素的key,否则,将新压入元素的min字段,设置为当前栈顶元素的min字段的值
(压入第一个元素时,直接设置当前 min <- key)
出栈-Pop:和以前一样删除就行
这样栈顶元素中的min字段,存储的就是栈中的最小值, 删除也不用额外的比较操作~
/*********************转载 结束**************************/
自己用代码实现之,如下
执行结果如下
这样有个问题就是当pop的时候,就没了最大最小值。
于是上网查,方案余下:
转自 http://blog.163.com/kevinlee_2010/blog/static/169820820201092091554523/
感谢原作者! 转载此文请保留原作者链接!
/*********************转载 开始**************************/
问题描述:
对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。
解决方案:
在栈的每个元素加一个属性值 min (用于记录当前位置下面的元素的最小值),元素的值用key表示
压栈-Push:当压入的元素key小于当前栈顶元素的min值时,将新压入元素的min字段设置为新压入元素的key,否则,将新压入元素的min字段,设置为当前栈顶元素的min字段的值
(压入第一个元素时,直接设置当前 min <- key)
出栈-Pop:和以前一样删除就行
这样栈顶元素中的min字段,存储的就是栈中的最小值, 删除也不用额外的比较操作~
/*********************转载 结束**************************/
自己用代码实现之,如下
#include "stdafx.h" #include <iostream> #include <stack> using namespace std; /**************************************** *2014/04/17 14:05:08 * * *Describtion: *O(1)时间取得栈中最大值和最小值 * *****************************************/ typedef struct _tagElement { //用值本身来初始化min 和 max字段 struct _tagElement(int val ) : value(val), min(val), max(val){} int value; //值字段 int min; //栈中最小值 int max; //栈中最大值 }Element; size_t PushStack(stack<Element>& st, Element e) { if (st.size() > 0) { //如果待插入元素的value 大于 栈顶元素的min字段值,则用栈顶元素的min字段更新待插入元素的min字段 if (e.value > st.top().min) { e.min = st.top().min; } //如果待插入元素的value 小于 栈顶元素的max字段值,则用栈顶元素的max字段更新待插入元素的max字段 if (e.value < st.top().max) { e.max = st.top().max; } } st.push(e); return st.size(); } int Max(stack<Element>& st) { if (st.size() <= 0) { return -1; } return st.top().max; } int Min(stack<Element>& st) { if (st.size() <= 0) { return -1; } return st.top().min; } int _tmain(int argc, _TCHAR* argv[]) { stack<Element> st; Element arr[] = {Element(10), Element(15), Element(15), Element(8), Element(1)}; for (int index = 0; index < sizeof(arr) / sizeof(arr[0]); ++ index) { size_t size = PushStack(st, arr[index]); } cout<<"The min value of st is "<<Min(st)<<endl; cout<<"The MAX value of st is "<<Max(st)<<endl; return 0; }
执行结果如下
相关文章推荐
- 【数据结构和算法】 O(1)时间取得栈中的最大 / 最小元素值
- C++ *max_element函数找最大元素 *min_element函数找最小元素 STL算法(找时间看)
- 用时间复杂度O(1)的算法求栈中的最小元素
- 构造栈的数据结构,要求实现min函数,通过min函数取得栈中的最小值。要求PUSH, POP, MIN的时间复杂度为O(1)
- O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素
- 面试题:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,要求函数min,push及pop的时间复杂度都是O(1)
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin返回该数据结构的最小元素 所有操作在最坏的情况下的运行时间都是O(1)
- Java 在栈中以常数时间求出栈中最小元素
- 设计一个栈,出栈时弹出栈中最小的元素,时间复杂度为1
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)
- 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
- 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。
- 在O(1)时间复杂度中,求栈中的最小元素
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)
- 微软等数据结构+算法面试100题(46)-- 查找最小的k 个元素
- 设计队列容器的数据结构,使得返回最大元素的操作时间复杂度尽可能的低。
- 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
- 面试训练O(1)时间取得栈内最小元素
- 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。时间复杂度都是O(1)