zoukankan      html  css  js  c++  java
  • 面试金典--min栈的实现

    题目描述:实现一个包含min操作的栈,时间复杂度需要是O(1)

    思路:一开始的想法是添加辅助栈保存当前最小元素,但是这样存在的问题就是不能处理重复元素;于是.....我还是google了,找到如下锦囊妙计

    不需要额外的空间,栈顶保存的是最小元素,每次push比较,如果当前元素更小的话就更新栈顶,另外栈顶以下元素保存的是元素push的时候与

    当时的最小值的差值;pop的时候,就是看栈顶元素后的下一个元素,如果小于零,说明当前需要pop最小元素,同时更新最小元素,如果大于零,

    直接push(最小元素+差值)即可。有点混乱:

    看例子:

    3 5 2 1

    push:

    3

    2 3

    2 -1 2

    2 -1 -1 1

    pop:

    2 -1 2 输出1

    2 3 输出2

    3 输出5

    输出3

     1 #include <iostream>
     2 #include <queue>
     3 #include <climits>
     4 #include <algorithm>
     5 #include <memory.h>
     6 #include <stdio.h>
     7 #include <ostream>
     8 #include <vector>
     9 #include <list>
    10 #include <cmath>
    11 #include <string>
    12 #include <stdexcept>
    13 #include <stack>
    14 using namespace std;
    15 
    16 template<typename T>
    17 class minStack
    18 {
    19 public:
    20     T pop();
    21     void push(const T& elem);
    22     T min();
    23     stack<T> s;
    24 };
    25 template<typename T>
    26 void minStack<T>::push(const T&elem)
    27 {
    28     if(s.empty())
    29     {
    30         s.push(elem);
    31         return;
    32     }
    33     T minval = s.top();
    34     s.pop();
    35     s.push(elem-minval);
    36     if(elem < minval)
    37     {
    38         s.push(elem);
    39     }
    40     else
    41         s.push(minval);
    42     return;
    43 }
    44 
    45 template<typename T>
    46 T minStack<T>::pop()
    47 {
    48     if(s.empty())
    49         throw std::out_of_range("stack is empty");
    50     T minval = s.top();
    51     s.pop();
    52     T val = s.top();
    53     s.pop();
    54     if(val <= 0)
    55     {
    56         s.push(minval - val);
    57         val = minval;
    58     }
    59     else
    60     {
    61         s.push(minval);
    62         val = minval+val;
    63     }
    64     return val;
    65 }
    66 
    67 int main()
    68 {
    69     return 0;
    70 }
  • 相关阅读:
    mongoDb学习以及spring管理 (包括百度云配置)
    Python循环嵌套
    Web应用功能测试测试点
    二维数组联通子数组
    二维数组最大子数组问题
    环一维数组最大子数组问题
    电梯调研
    最大子数组问题
    小学生题目
    3.13题目思路
  • 原文地址:https://www.cnblogs.com/cane/p/3793510.html
Copyright © 2011-2022 走看看