栈的最大值问题 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顺序入栈,则两个栈中存储的元素如下图所示:

《栈的最大值问题 max问题 min问题 队列的max问题》

 

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

 

 

问题描述: 一个
整数栈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入栈后的情况

《栈的最大值问题 max问题 min问题 队列的max问题》

 

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

《栈的最大值问题 max问题 min问题 队列的max问题》

 

3. 元素15入栈后的情况

《栈的最大值问题 max问题 min问题 队列的max问题》

 

4. 元素15出栈时的情况

《栈的最大值问题 max问题 min问题 队列的max问题》

 

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

《栈的最大值问题 max问题 min问题 队列的max问题》

(修正:最后一图,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; 
}

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/youxin/p/4371165.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞