Stack(篇2)设计一个栈能在O(1)的时间和O(1)的空间getMin()
2017-03-23 22:08
246 查看
在上一篇文章中实现了
使用O(1)时间和O(n)的额外空间的方法getMin()。Stack(篇3)设计一个栈能够在O(1)的时间内getMin
在本文中,讨论了一种支持O(1)额外空间的最新方法。我们定义一个变量minEle,它存储堆栈中的当前最小元素。现在的问题是如何处理最小元素被删除的情况。为了处理这个,我们将“2x-minEle”推入堆栈而不是x,以便可以使用当前的minEle检索先前的最小元素,并将其值存储在堆栈中。
以下是算法的核心部分。
Push(x):
①如果堆栈为空,则将x插入堆栈,并使minEle等于x。
②如果堆栈不为空,请将x与minEle进行比较。出现两种情况:
③如果x大于或等于minEle,只需插入x。
④如果x小于minEle,则将(2 * x - minEle) 压到栈中,将minEle的值更新为 x。
Pop():
①从顶部移除元素 将删除的元素设为y。出现两种情况:
②如果y大于minEle,则堆栈中的最小元素仍为minEle。
③如果y小于或等于minEle,则最小元素现在变为(2 * minEle - y),因此更新minEle = 2 * minEle - y。
得到了前一个minEle。
重点:
①如果到目前为止,堆栈不保持元素的实际值。
②实际最小元素始终存储在minEle中
例如数组:{4,2,1,1,5,-1}
插入
下图中黄色部分是放到栈中的值,绿色部分是当前minEle的值变化情况实际上minEle的值并不需要栈来保存,只需要一个变量来保存每次最顶上的就可以。红色部分是压栈的顺序。
①当栈为空时,放入的第一个元素赋值给 minEle。将4压入栈中当前最小值 minEle=4。
② 遍历到2时,将2与minEle比较,2
③ 遍历到1时,将1与minEle=2比较,1
④ 遍历到5时,将5与minEle=1比较,5
⑤遍历到-1时,将-1与minEle=1比较,-1
删除
①删除栈顶元素 -3,比较-3与minEle的值,发现 -3
②删除栈顶元素5,5
代码
使用O(1)时间和O(n)的额外空间的方法getMin()。Stack(篇3)设计一个栈能够在O(1)的时间内getMin
在本文中,讨论了一种支持O(1)额外空间的最新方法。我们定义一个变量minEle,它存储堆栈中的当前最小元素。现在的问题是如何处理最小元素被删除的情况。为了处理这个,我们将“2x-minEle”推入堆栈而不是x,以便可以使用当前的minEle检索先前的最小元素,并将其值存储在堆栈中。
以下是算法的核心部分。
Push(x):
①如果堆栈为空,则将x插入堆栈,并使minEle等于x。
②如果堆栈不为空,请将x与minEle进行比较。出现两种情况:
③如果x大于或等于minEle,只需插入x。
④如果x小于minEle,则将(2 * x - minEle) 压到栈中,将minEle的值更新为 x。
Pop():
①从顶部移除元素 将删除的元素设为y。出现两种情况:
②如果y大于minEle,则堆栈中的最小元素仍为minEle。
③如果y小于或等于minEle,则最小元素现在变为(2 * minEle - y),因此更新minEle = 2 * minEle - y。
得到了前一个minEle。
重点:
①如果到目前为止,堆栈不保持元素的实际值。
②实际最小元素始终存储在minEle中
例如数组:{4,2,1,1,5,-1}
插入
下图中黄色部分是放到栈中的值,绿色部分是当前minEle的值变化情况实际上minEle的值并不需要栈来保存,只需要一个变量来保存每次最顶上的就可以。红色部分是压栈的顺序。
①当栈为空时,放入的第一个元素赋值给 minEle。将4压入栈中当前最小值 minEle=4。
② 遍历到2时,将2与minEle比较,2
<minEle, 此时将 2*2-minEle=0 压入栈中,minEle=2。
③ 遍历到1时,将1与minEle=2比较,1
<minEle,此时将 1*2-minEle=0 压入栈中,minEle=1。
④ 遍历到5时,将5与minEle=1比较,5
>minEle,直接压栈,minEle不变。
⑤遍历到-1时,将-1与minEle=1比较,-1
<minEle,此时将 -1*2-minEle=-3压入栈中,minEle=-1。
删除
①删除栈顶元素 -3,比较-3与minEle的值,发现 -3
<minEle=-1,此时原来栈顶元素应该是:-3-2*minEle=-1 , 更新minEle=2*minElen+3=1.
②删除栈顶元素5,5
>minEle,直接删除。
代码
package Stack; import java.util.Stack; public class Mystack { public static int minEle=0; Stack< Integer> stack; public static void main(String[] args) { // TODO Auto-generated method stub Mystack stack=new Mystack(new Stack<Integer>()); stack.push(3); stack.push(4); stack.push(2); stack.push(1); stack.push(5); System.out.println(stack.getMin()); stack.pop(); stack.pop(); System.out.println(stack.getMin()); stack.pop(); stack.pop(); System.out.println(stack.getMin()); } public Mystack(Stack<Integer> stack) { this.stack = stack; } public void push(int num) { if(stack.isEmpty()) { minEle=num; stack.push(num); } else { if(minEle<num) stack.push(num); else { stack.push(2*num-minEle); minEle=num; } } } public int pop() { if(!stack.isEmpty()) { if(stack.peek()<=minEle) { minEle=2*minEle-stack.peek(); } return stack.pop(); } else { return 0; } } public int getMin() { return minEle; } }
相关文章推荐
- Stack(篇3)设计一个栈能够在O(1)的时间内getMin
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 《数据结构》2.10设计一个算法,删除顺序表中值为item的元素,要求算法的时间复杂度是O(n),空间复杂度是O(1)
- 试设计一个算法,将数组A(0..n-1)中的元素循环右移k位,并要求空间复杂度为O(1),时间复杂度为O(n)。
- 算法7:设计一个class,类似于stack, 但可以是O(1)时间内返回min()
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- Stack介绍以及设计一个有getMin 功能的栈
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。
- C#--第11周实验--任务1(建立Windows窗体应用程序)--设计一个窗体--单击按钮时,在标签上显示当前系统时间 .
- C#--第11周实验--任务1(建立Windows窗体应用程序)--设计一个窗体--单击按钮时,在标签上显示当前系统时间
- 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
- java第二周---.用线程设计一个时间类,并显示时间