zoukankan      html  css  js  c++  java
  • 剑指Offer

    剑指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代码。
     1 // 652500    zhuli19901106    1522    Accepted    点击此处查看所有case的执行结果    1024KB    872B    20MS
     2 // 201311170256
     3 #include <cstdio>
     4 #include <vector>
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     int n;
    10     int i;
    11     int tmp;
    12     vector<int> st, min_st;
    13     char s[10];
    14     
    15     while(scanf("%d", &n) == 1){
    16         st.clear();
    17         min_st.clear();
    18         for(i = 0; i < n; ++i){
    19             scanf("%s", s);
    20             if(s[0] == 's'){
    21                 scanf("%d", &tmp);
    22                 st.push_back(tmp);
    23                 if(min_st.size() <= 0 || tmp <= min_st[min_st.size() - 1]){
    24                     min_st.push_back(tmp);
    25                 }
    26             }else if(s[0] == 'o'){
    27                 if(st.size() > 0 && min_st.size() > 0){
    28                     if(st[st.size() - 1] <= min_st[min_st.size() - 1]){
    29                         min_st.pop_back();
    30                     }
    31                     st.pop_back();
    32                 }
    33             }
    34             
    35             if(min_st.size() > 0){
    36                 printf("%d
    ", min_st[min_st.size() - 1]);
    37             }else{
    38                 printf("NULL
    ");
    39             }
    40         }
    41     }
    42     
    43     return 0;
    44 }
  • 相关阅读:
    60款很酷的 jQuery 幻灯片演示和下载
    分享27款非常棒的 jQuery 表单插件
    10款新鲜出炉的 jQuery 插件
    5 个很炫的 HTML5 游戏
    12款高质量的免费 HTML 网页模板下载
    jquery插件整理篇(四)自动补全类插件
    jquery插件整理篇(三)图片展示插件
    超强1000个jquery插件!
    34个漂亮的应用程序后台管理系统界面(系列二)
    jquery插件整理篇(九)数据验证类
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3451990.html
Copyright © 2011-2022 走看看