zoukankan      html  css  js  c++  java
  • 栈的最大值问题 max问题 min问题 队列的max问题

    常数时间求栈的最大值
     
    问题描述:
    一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。
    设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。

    可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂度无要求。

    算法描述:

    一个存储所有最大值的栈Sm。

    1. 当push入栈的元素大于当前最大元素,将该元素压入最大值栈Sm;

    2. Sm栈顶始终保存栈中当前的最大元素;

    3. 当前最大元素被pop出栈时,将Sm栈顶的对应最大元素也弹出栈。

    max操作即为获得Sm栈顶最大元素。

    假设元素以5,4,1,2,3,10,9,8,6,7,15顺序入栈,则两个栈中存储的元素如下图所示:

    常数时间空间求栈的最大值

    问题描述:
    一个整数栈stack,具有push和pop操作,其时间空间复杂度皆为O(1)。
    设计算法max操作,求栈中的最大值,该操作的时间空间复杂度也要求为O(1)。

    可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间空间复杂度。

    算法描述:

    量Max保存当前最大元素值,初始值为最小整数m。

    1. 当push入栈时,将(当前元素-Max)存入栈中,

    若当前元素小于Max,栈中元素为负数;

    若当前元素大于等于Max,栈中元素为非负数,将Max替换为当前元素

    2. 当pop出栈时,

    若栈中元素为负数,则将(栈中元素+Max)弹出栈;

    若栈中元素为非负数,则将Max弹出栈,并将Max替换为(Max-栈中元素)。

    3. Max即为当前栈中最大元素值。

    主要思路是将最大值以某种方式在原有栈中标记出来,从而减少空间使用。可以用正负数来区分普通元素和最大值元素:

    普通元素使用负数存储(元素-Max);

    最大值元素使用非负数存储(New Max - Old Max);

    这样便可在栈中区分普通元素和最大值元素,并可通过Max恢复Old Max。

    假设元素以5,4,1,2,3,10,9,8,6,7,15顺序入栈,则两个栈中存储的元素如下图所示:


    1. 元素5,4,1,2,3入栈后的情况

    2. 元素10,9,8,6,7入栈后的情况

    3. 元素15入栈后的情况

    4. 元素15出栈时的情况

    5. 元素15出栈后的情况(恢复原有状态)

    (修正:最后一图,Max改为10,栈中最右边的格子为空,当时画图手抖画错了...= =#)

    参考:http://blog.csdn.net/taotaotheripper/article/details/8652665

    快速得到最大值的队列

    两个栈可以实现队列(参考),就用刚才的栈实现队列

    http://www.cnblogs.com/kaituorensheng/p/3529942.html

    2.设计包含min 函数的栈。 
    定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。 
    要求函数min、push 以及pop 的时间复杂度都是O(1)。 
    ANSWER: 
    Stack is a LIFO data structure. When some element is popped from the stack, the status will recover to the original status as before that element was pushed. So we can recover the minimum element, too.

    struct MinStackElement { 
      int data; 
      int min; 
    };

    struct MinStack { 
      MinStackElement * data; 
      int size; 
      int top; 
    }

    MinStack MinStackInit(int maxSize) { 
      MinStack stack; 
      stack.size = maxSize; 
      stack.data = (MinStackElement*) malloc(sizeof(MinStackElement)*maxSize); 
      stack.top = 0; 
      return stack; 

    void MinStackFree(MinStack stack) { 
      free(stack.data); 

    void MinStackPush(MinStack stack, int d) { 
      if (stack.top == stack.size) error(“out of stack space.”); 
      MinStackElement* p = stack.data[stack.top]; 
      p->data = d; 
      p->min = (stack.top==0?d : stack.data[top-1]); 
      if (p->min > d) p->min = d; 
      top ++; 

    int MinStackPop(MinStack stack) { 
      if (stack.top == 0) error(“stack is empty!”); 
      return stack.data[--stack.top].data; 

    int MinStackMin(MinStack stack) { 
      if (stack.top == 0) error(“stack is empty!”); 
      return stack.data[stack.top-1].min; 
    }

  • 相关阅读:
    Delphi中多标签页面的实现
    选择排序
    关于Delphi中TRttiContext.FindType失效的问题
    Delphi中拖动无边框窗口的5种方法
    集中精力做最有价值的事情,而不必把主要精力都浪费在自我包装上(例如学位,头衔,自吹自擂)——沉痛反思:我以前还真是这样
    QModelIndex有internalPointer()函数,可以存任何数据,另有QAbstractItemModel::createIndex来创造节点
    沉没成本——无法收回的成本,但不要影响下一次决策
    使用HttpURLConnection实现多线程下载
    Delphi6/7 中XML 文档的应用
    delphiXE调用Objective-c库
  • 原文地址:https://www.cnblogs.com/youxin/p/4371165.html
Copyright © 2011-2022 走看看