zoukankan      html  css  js  c++  java
  • 牛客网剑指offer第20题——定义栈的数据结构

    题目:

    定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
    先上代码:
     1 class Solution {
     2   private:
     3         vector<int> stack;
     4         vector<int> minval; //用一个数无法完成最小值为O(n),必须用一个序列对其进行存储
     5 public:
     6     void push(int value) {  //需要同时对最小元素和最大元素进行入栈出栈操作
     7         stack.push_back(value);
     8         if(stack.size() == 1)
     9             minval.push_back(value);
    10         else 
    11         {
    12             if(minval.back() > top())
    13                 minval.push_back(top());
    14             else 
    15                 minval.push_back(minval.back());
    16         }
    17     }
    18     void pop() {          //
    19         if(stack.size())
    20         {
    21             stack.pop_back();
    22             //if(minval > top())
    23                 minval.pop_back();
    24         }
    25     }
    26     int top() {
    27         if(stack.size())
    28             return stack.back();
    29     }
    30     int min() {
    31         if(stack.size())
    32             return minval.back();//返回索引数组
    33     }
    34         
    35 };

    思路:既然要实现栈的数据结构,所以自然我们不能使用自带的栈去实现了吧,这里我们采用数组的方式实现。

       这个题的难点在于:使用O(1)时间复杂度的方式实现min()函数,我们所应该认识到的是:找最小值意味着要进行比较,那么如果我们不采用缓存机制,我们是没有办法实现O(1)时间复杂度的。开始的时候,我试图只用一个int型变量试图存放当前状态下的最小值,后来发现这根本是不可能实现的。我们必须用另外一个数组空间也模拟一个栈,来动态维护当前数据栈中的最小值。我们需要清楚的是:当原数组构成的栈进行push和pop的时候,这个最小值状态栈必然也会动态的发生变化,我们只需要取其索引即可。

    下面给出一些在上述代码中vector中用到的函数;

    back(),返回数组的最后一个元素
    
    pop_back(),删除数组的最后一个元素。
     
  • 相关阅读:
    thinkphp--标签库
    thinkphp中的参数绑定
    thinkphp3.2.3子查询中遇到的错误
    开篇马克
    BST树、B-树、B+树、B*树
    linux shell编程之变量和bash配置文件(第一篇)
    linux awk进阶篇
    linux awk(gawk)
    linux sed命令
    linux basic
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12386876.html
Copyright © 2011-2022 走看看