剑指Offer - 九度1522 - 包含min函数的栈
2013-12-01 23:44
题目描述:

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

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。

输出:

对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。

样例输入:
7
s 3
s 4
s 2
s 1
o
o
s 0
样例输出:
3
3
2
1
2
3
0
题意分析:
  默认的栈不论pop还是push都是O(1)时间的操作,如果想得到最小元素的话,还得用O(n)的复杂度去扫描得出。因此,我们另外用一个栈来记录最小元素,将原本O(n)的操作分配到每一次操作中,实现平均O(1)的复杂度。思路如下:
    1. 两个栈s和smin。s表示元素栈,就是普通的堆栈,存储所有元素。smin是最小栈,只存最小元素。
    2. 栈为空时,push操作直接入栈s和smin,pop操作无效。
    3. push入栈时,对于s直接push;对于smin,如果当前元素不大于smin的栈顶元素,则push,否则跳过。
    4. pop出栈时,对于s直接pop;对于smin,如果pop出的元素不大于smin的栈顶元素,则pop,否则跳过。
    5. smin的栈顶元素就是所有元素的最小值。
  其实可以这么想,元素进进出出,有大有小。每当有更小的元素进来以后,最小值才会更新,如果某个最小值的元素被pop了,那么最小值就变回了原来排第二小的值。所以我们可以把最小值按先后顺序记录下来,形成的就是一个单调递减(不严格)的数列,这个数列就是smin。
  pop操作、push操作、min操作都是O(1)时间复杂度。需要维持额外的O(n)空间来记录最小栈,所以空间复杂度是O(n)。以下是ac代码。
 // 652500    zhuli19901106    1522    Accepted    点击此处查看所有case的执行结果    1024KB    872B    20MS
//
#include <cstdio>
#include <vector>
using namespace std; int main()
{
int n;
int i;
int tmp;
vector<int> st, min_st;
char s[]; while(scanf("%d", &n) == ){
st.clear();
min_st.clear();
for(i = ; i < n; ++i){
scanf("%s", s);
if(s[] == 's'){
scanf("%d", &tmp);
st.push_back(tmp);
if(min_st.size() <= || tmp <= min_st[min_st.size() - ]){
min_st.push_back(tmp);
}
}else if(s[] == 'o'){
if(st.size() > && min_st.size() > ){
if(st[st.size() - ] <= min_st[min_st.size() - ]){
min_st.pop_back();
}
st.pop_back();
}
} if(min_st.size() > ){
printf("%d\n", min_st[min_st.size() - ]);
}else{
printf("NULL\n");
}
}
} return ;
}

剑指Offer - 九度1522 - 包含min函数的栈的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 剑指Offer - 九度1371 - 最小的K个数

    剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...

  7. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  8. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  9. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

随机推荐

  1. 笨办法学Python(三十六)

    习题 36: 设计和调试 现在你已经学会了“if 语句”,我将给你一些使用“for 循环”和“while 循环”的规则,一面你日后碰到麻烦.我还会教你一些调试的小技巧,以便你能发现自己程序的问题.最后 ...

  2. 详解 CSS 居中布局技巧

    水平居中元素: 通用方法,元素的宽高未知 方式一:CSS3 transform .parent { position: relative; } .child { position: absolute; ...

  3. 通过WEB网管登录

    6.1  通过WEB网管登录简介 S5100-SI/EI系列以太网交换机提供内置的WEB Server,用户可以通过WEB网管终端(PC)登录到交换机上,利用内置的WEB Server以WEB方式直观 ...

  4. PHP设计模式练习——制作简单的投诉页面

    ---恢复内容开始--- <?php /* * 设计模式练习 * 1.数据库连接类(单例模式) * 2.调用接口实现留言本功能(工厂模式) * 3.实现分级举报处理功能(责任链模式) * 4.发 ...

  5. ioc 的好文章 转自 GavinJun

    https://www.cnblogs.com/fuchongjundream/p/3873073.html

  6. Java中阻塞队列的使用

    http://blog.csdn.net/qq_35101189/article/details/56008342 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如 ...

  7. webpack-dev-middleware插件的使用

    我们在使用webpack 编译文件时,每次改动文件都要去重新编译,是不是很麻烦,这时候我们就用到了webpack-dev-middleware 插件,该插件对更改的文件进行监控,编译, 一般和 web ...

  8. python :编写装饰器

    简单装饰器 def log_time(func): # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用 def make_decorater(): print('现在开始装饰') f ...

  9. js中的变量提升(Hoisting)

    <script> function test(){ console.log(a); console.log(foo()); var a=1; function foo(){ return ...

  10. mpvue重构小程序之坑点1

    对于最近刚做的项目,想着用框架重新架构一遍,方便以后拓展,毕竟现在拓展方向非常大. 目前主要碰到两个略坑的问题: 1: 关于用户授权信息的按钮,原生是以下方式,使用bindgetuserinfo事件 ...