题目:

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

在该栈中,调用min,push,pop的时间复杂度都是O(1)

思路:

1、除了原来的栈s,增加一个辅助栈s_min,用来保存每次进栈时的最小元素。

Push操作:

栈s:元素value直接进栈s;

栈s_min:判断s_min是否为空或者value是否小于s_min的栈顶元素,如果是,将value压入栈s_min,否则将s_min.top()压入栈s_min;

Pop操作:

栈s:s.pop();

栈s_min:s_min.pop();

Min操作:

return s_min.top();

2、思路1有个缺点就是如果每次进栈的元素都比原来最小元素大,那么栈中会重复记录相同的数字,这样大大浪费了存储空间。因此,我们可以只记录一个:

push操作:

栈s:元素value直接进栈s;

栈s_min:判断s_min是否为空或者value是否小于s_min的栈顶元素,如果是,将value压入栈s_min,否则不作为。

pop操作:

栈s:s.pop();

栈s_min:如果s.top()等于s_min.top(),则s_min.pop(),否则不作为;

Min操作:

return s_min.top();

缺点:当入栈存在重复元素时,在s_min的pop操作时会出现问题,这时需要在s_min中的每个最小值元素添加一个计数器,当计数器为0时,才进行pop操作。

代码:

这里只贴出思路1的实现代码。

template<typename T>
class StackWithMin{
public:
void push(const T& value);
void pop();
const T& min() const;
private:
stack<T> s;
stack<T> s_min;
}; template<typename T>
void StackWithMin<T>::push(const T& value){
s.push(value);
if(s_min.empty() || value<s_min.top())
s_min.push(value);
else
s_min.push(s_min.top());
} template<typename T>
void StackWithMin<T>::pop(){
assert(!s.empty() && !s.empty());
s.pop();
s_min.pop();
} template<typename T>
const T& StackWithMin<T>::min() const{
assert(!s.empty() && !s.empty());
return s_min.top();
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/4c776177d2c04c2494f2555c9fcc1e49?rp=1

AC代码:

class Solution {
public:
void push(int value) {
s.push(value);
if(s_min.empty() || value<s_min.top())
s_min.push(value);
else
s_min.push(s_min.top());
}
void pop() {
s.pop();
s_min.pop();
}
int top() {
return s.top();
}
int min() {
return s_min.top();
}
private:
stack<int> s;
stack<int> s_min;
};

  

(剑指Offer)面试题21:包含min函数的栈的更多相关文章

  1. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  2. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

  3. 剑指Offer - 九度1522 - 包含min函数的栈

    剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...

  4. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  5. 剑指offer二十之包含min函数的栈

    一.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.思路 用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数.每次元素存入minSt ...

  6. 【剑指Offer】20、包含min函数的栈

      题目描述:   定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   解题思路:   使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...

  7. 《剑指offer》面试题21 包含min函数的栈 Java版

    (min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...

  8. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

  9. 剑指offer-面试题21.包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ...

  10. 题目21 包含Min函数的栈

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21  包含 ...

随机推荐

  1. jquery validate如何不提交表单就做验证(ajax提交数据)

    if($("#FromID").valid()){ $.ajax({ type:'post', url:'/CampaignOrderRelations/save', data:{ ...

  2. oracle sql语句跟踪

    select b.SQL_TEXT,b.FIRST_LOAD_TIME,b.SQL_FULLTEXT    from v$sqlarea b    order by  b.FIRST_LOAD_TIM ...

  3. web医疗影像浏览demo及地址

    各种web影像浏览demo及地址1.WPACS http://demo.dayisheng.com 帐号密码 cc dd(http://demo.dayisheng.com/wpacs33.aspx? ...

  4. 设置TextView控件的背景透明度和字体透明度

    TextView tv = (TextView) findViewById(R.id.xx); 第1种:tv.setBackgroundColor(Color.argb(255, 0, 255, 0) ...

  5. Web开发中设置快捷键来增强用户体验

    从事对日外包一年多以来,发现日本的无论是WinForm项目还是Web项目都注重快捷键的使用,日本人操作的时候都喜欢用键盘而不是用鼠标去点,用他们的话来说"键盘永远比鼠标来的快",所 ...

  6. redhat Enterprise Linux Server release 7.2(Maipo) 安装redis-stat

    项目需要在rh7.2安装redis-stat,各种编译不过.通过一步步跟踪编译错误日志发现时缺少各种开发库. 需要安装的库列表如下: zlib-devel openssl-devel readline ...

  7. python字典概述

    字典 1.    概述 字典是一个无序的数据集合,序列类型用有序的数字键做索引将数据以数组的形式存储. 在字典中能获得的有序集合只能是键的集合或者是值得集合,方法keys()或者value()返回一个 ...

  8. Sql group by 分组取时间最新的一条数据

    with MiPriceTopOne as (select classid,max(dataTime) dataTime,max(id) as id from MiPrice group by cla ...

  9. samba服务设置,Linux系统和Windows文件共享

    samba是一个工具套件,在Unix上实现SMB(Server Message Block)协议,或者称之为NETBIOS/LanManager协议.SMB协议通常是被windows系列用来实现磁盘和 ...

  10. 第三百五十四天 how can I 坚持

    你的问题主要在于:读书不多而买书太多:读书太少又特爱思考,还话唠.. 2012年毕业,辗转无锡,上海,最后来到了北京,逛了北京, 2013年,清明去爬了长城,从天通苑搬到了甜水园, 2014年,爬了泰 ...