Stack(篇3)设计一个栈能够在O(1)的时间内getMin
2017-03-23 22:17
218 查看
问题:设计一个数据结构SpecialStack,支持所有的栈操作,如push(),pop(),isEmpty(),isFull()和一个附加的操作getMin()它应该从SpecialStack返回最小元素。SpecialStack的所有这些操作必须是O(1)。要实现SpecialStack,你应该只使用标准的Stack数据结构,没有其他数据结构,如数组,列表,等等。
例:
解决方案:
使用两个堆栈:一个用于存储实际堆栈元素,另一个用作存储最小值的辅助堆栈。这个想法是以push()和pop()操作,使得辅助堆栈的顶部始终是最小的。让我们看看push()和pop()操作如何工作。
Push(int x)//将元素x插入到特殊堆栈
1)将x推送到第一个堆栈(具有实际元素的堆栈)
2)将x与第二个堆栈(辅助堆栈)的顶部元素进行比较。让顶部元素为y。
… ..a)如果x小于y,则将x推到辅助堆栈。
… ..b)如果x大于y,则将y推送到辅助堆栈。
int Pop()//从特殊堆栈中删除一个元素并返回已移除的元素
1)从辅助堆栈弹出顶部元素。
2)从实际堆栈中弹出顶部元素并返回。
步骤1是必要的,以确保辅助堆栈也被更新以用于将来的操作。
int getMin()//从特殊堆栈返回最小元素
1)返回辅助堆栈的顶部元素。
我们可以看到,所有上述操作都是O(1)。
让我们看一个例子。让我们假设两个堆栈最初是空的,18,19,29,15和16被插入到SpecialStack中。
代码
getMin()时间复杂度为O(1)空间复杂度为O(n)
下一篇中将实现getMin()时间复杂度为O(1)空间复杂度为也为O(1)。
Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()
例:
请考虑以下SpecialStack 16 - > TOP 15 29 19 18 当getMin()被调用时,它应返回15,这是最小值 元素在当前堆栈。 如果我们在堆栈上弹出两次,堆栈就变成了 29 - > TOP 19 18 当调用getMin()时,它应该返回18是最小值 在当前堆栈中。
解决方案:
使用两个堆栈:一个用于存储实际堆栈元素,另一个用作存储最小值的辅助堆栈。这个想法是以push()和pop()操作,使得辅助堆栈的顶部始终是最小的。让我们看看push()和pop()操作如何工作。
Push(int x)//将元素x插入到特殊堆栈
1)将x推送到第一个堆栈(具有实际元素的堆栈)
2)将x与第二个堆栈(辅助堆栈)的顶部元素进行比较。让顶部元素为y。
… ..a)如果x小于y,则将x推到辅助堆栈。
… ..b)如果x大于y,则将y推送到辅助堆栈。
int Pop()//从特殊堆栈中删除一个元素并返回已移除的元素
1)从辅助堆栈弹出顶部元素。
2)从实际堆栈中弹出顶部元素并返回。
步骤1是必要的,以确保辅助堆栈也被更新以用于将来的操作。
int getMin()//从特殊堆栈返回最小元素
1)返回辅助堆栈的顶部元素。
我们可以看到,所有上述操作都是O(1)。
让我们看一个例子。让我们假设两个堆栈最初是空的,18,19,29,15和16被插入到SpecialStack中。
当我们插入18时,两个堆栈都变为以下。 实际堆栈 18 <---顶 辅助堆栈 18 <----顶 当插入19时,两个堆栈都将更改为以下。 实际堆栈 19 <---顶 18 辅助堆栈 18 <----顶 18 当插入29时,两个堆栈都将更改为以下。 实际堆栈 29 <---顶 19 18 辅助堆栈 18 <----顶 18 18 当插入15时,两个堆栈都将更改为以下。 实际堆栈 15 <---顶 29 19 18 辅助堆栈 15 <----顶 18 18 18 当插入16时,两个堆栈都更改为以下。 实际堆栈 16 <---顶 15 29 19 18 辅助堆栈 15 <----顶 15 18 18 18
代码
import java.util.Stack; public class StackMin { Stack<Integer> stack=new Stack<Integer>(); Stack<Integer> minStack=new Stack<Integer>(); public static void main(String[] args) { // TODO Auto-generated method stub int [] pushA={1,2,3,4,5};int [] popA={4,5,3,1,2}; System.out.println(IsPopOrder(pushA,popA)); } public static boolean IsPopOrder(int [] pushA,int [] popA) { Stack<Integer> stack=new Stack<Integer>(); int j=0; for(int i=0;i<popA.length;i++) { if(!stack.isEmpty()&&(stack.peek()==popA[i])) { stack.pop(); } else { while(j<pushA.length&&(pushA[j]!=popA[i])) { stack.push(pushA[j]); j++; } if(j==pushA.length) return false; else { j++; } } } return true; } public void push(int node) { stack.push(node); if(minStack.isEmpty()) { minStack.push(node); } else { if(node<=minStack.peek()) minStack.push(node); } } public void pop() { if(minStack.peek()==stack.peek()) minStack.pop(); stack.pop(); } public int top() { return stack.peek(); } public int min() { return minStack.peek(); } }
getMin()时间复杂度为O(1)空间复杂度为O(n)
下一篇中将实现getMin()时间复杂度为O(1)空间复杂度为也为O(1)。
Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()
相关文章推荐
- Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()
- 算法7:设计一个class,类似于stack, 但可以是O(1)时间内返回min()
- 设计一个栈,提供一个函数能够找出栈内最大的元素,时间复杂度为O(1)
- 有1000亿条记录,每条记录由url,ip,时间组成,设计一个系统能够快速查询以下内容(程序设计题)
- Stack介绍以及设计一个有getMin 功能的栈
- 有1000亿条记录,每条记录由url,ip,时间组成,设计一个系统能够快速查询以下内容
- 十四周项目三设计一个抽象类CSolid,含有用于求表面积及体积的两个纯虚函数(第一次做完老师发的试题,还有时间做OJ上面的题,贵在坚持)
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。
- 程序员面试指南之设计一个有GetMin功能的栈
- c++设计一个计时器(能够暂停,重新开始,继续)的功能。写的不好,仅供参考!
- 设计一个单链表的类模板,使其能够完成单链表的创建和显示
- 设计一个时间类Time,要求: (1)包含时(hour)、分(minute)和秒(second)私有数据成员。 (2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
- 每一个设计都应该计划能够解决一个问题!
- 设计一个有getMin功能的栈
- 【一个批量计算的调度系统的设计与实现】如果需要对成千上万的网络抓包数据文件在规定的时间内进行解析,应该怎么做?
- java第二周---.用线程设计一个时间类,并显示时间
- 左神的书——《程序员代码面试指南》之设计一个有getmin功能的栈 c++实现
- 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。时间复杂度都是O(1)