常数时间求栈的最大值
 
问题描述:
一个栈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; 
}

栈的最大值问题 max问题 min问题 队列的max问题的更多相关文章

  1. zip()函数,max()和min(),built-in function,import模块,read(),readlines(),write(),writelines(),with..as..文件处理方式

    zip()函数:将可迭代对象作为参数,将对象中的对应元素打包成一个个元组. #map()普通的输出例子 print(list(zip(('a','n','c'),(1,2,3)))) print(li ...

  2. 2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]

    [本文链接] http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html [题目] 对于一个由N个整数组成的数组,需要比较多少次才能把 ...

  3. 如何在O(1)时间复杂度获取栈中最大值和最小值

    问题描述: 如何在O(1)时间复杂度获取栈中的最大值和最小值? 问题分析: 普通栈规定的push(入栈).pop(出栈).peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就 ...

  4. 维护满足max(+ or -)min<=k的区间

    这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...

  5. SQL中MAX()和MIN()函数的使用(比较字符串的大小)

    在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面就将为您分别介绍MAX()函数和MIN()函数的使用,供您参考,希望对您学习SQL数据库能有些帮助. 当需要了解一列中的最 ...

  6. 带有key参数的函数filter,map,max,min

    内置函数———filter def is_not_empty(s): return s and len(s.strip()) > 0 filter(is_not_empty, ['test', ...

  7. Python之路Python内置函数、zip()、max()、min()

    Python之路Python内置函数.zip().max().min() 一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算, ...

  8. Math.min() Math.max() Math.min().apply() Math.max() .apply()该如何使用???

    Math.min()和 Math.max()  语法: Math.min(x,y) Math.max(x,y) 虽然能取到最小值和最大值,但是不支持数组. 那么如何计算数组中的大小值呢???????? ...

  9. 【MySQL】汇总数据 - avg()、count()、max()、min()、sum()函数的使用

    第12章 汇总数据 文章目录 第12章 汇总数据 1.聚集函数 1.1.AVG()函数 avg() 1.2.COUNT()函数 count() 1.3. MAX()函数 max() 1.4.MIN() ...

随机推荐

  1. tf.nn.conv2d实现卷积的过程

    #coding=utf-8 import tensorflow as tf #case 2 input = tf.Variable(tf.round(10 * tf.random_normal([1, ...

  2. 字符串类为JAVA中的特殊类

    字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复.因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串.如果遇到String a=”hello”时(注意 ...

  3. html的a标签的 href 和 onclick。

    主要用于给超链接添加点击事件. aa.html <html> <body> <span>this si</span> </body> < ...

  4. CSS伪类选择器 - nth-child(an+b):

    CSS伪类选择器 - nth-child(an+b): 第一种:简单数字序号写法:nth-child(number)直接匹配第number个元素.参数number必须为大于0的整数.li:nth-ch ...

  5. [转]Shell脚本中发送html邮件的方法

    <span "="">作为运维人员,免不了要编写一些监控脚本,并将监控结果及时的发送出来.那么通过邮件发送是比较常用的一种通知方式了.通常的,如果需要发送的内 ...

  6. ulimit命令学习

    通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值.那么应该在 ...

  7. C#中动态调用DLL动态链接库

    其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress ...

  8. [UIImage _isCached]: message sent to deallocated instance

    本文转载至 http://zhuhaibobb.blog.163.com/blog/static/2744006720124191633375/       这几天做了个APP打开20份钟左右就强制退 ...

  9. D3D中的渲染状态简介

    1). 设置着色模式: SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT) //设置平面着色模式 SetRenderState(D3DRS_SHADEMODE ...

  10. jquery中return false的作用

    jquery中的return false既阻止默认事件,又阻止冒泡: 在原生的js中,return false只有一个功能,那就是阻止默认事件. <!DOCTYPE html> <h ...