【Java】设计一个栈,并且push,pop和min三个方法的时间复杂度必须为O(1)

原创 2015年07月10日 13:29:41

设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。

push,pop和min三个方法的时间复杂度必须为O(1)

要保证min的时间复杂度为O(1), 那就不能每次通过遍历整个栈来获取最小值。假设这个栈初始为5:

5; 最小值为5; 压入7,栈变为

7,5;最小值为5; 压入3,栈变为

3,7,5; 最小值为3


这时弹出3,栈变为

7,5; 最小值为5; 弹出7, 栈变为

5; 最小值为5;


注意在7,5这个状态时,最小值都是5. 也就是说,如果我们能标记出栈的每个状态,那么可以直接取出最小值。可以用一个栈来保存最小值。

stack类的peek()方法,查看栈顶对象而不移除它

解法一:

import java.util.Stack;

class NodeWithMin {
	public int value;
	public int min;
	public NodeWithMin(int v, int min) {
		value = v;
		this.min = min;
	}
}

public class StackWithMin extends Stack<NodeWithMin> {
	public void push(int value) {
		int newMin = Math.min(value, min());
		super.push(new NodeWithMin( value, newMin));
	}
	
	public int min() {
		if ( this.isEmpty() ) {
			return Integer.MAX_VALUE;
		}
		else {
			return peek().min;
		}
	}
}


解法二:

import java.util.Stack;

public class StackWithMin2 extends Stack<Integer> {
	//an extra stack to store the minimum in every push operation
	Stack<Integer> s2;
	public StackWithMin2() {
		s2 = new Stack<Integer>();
	}
	
	public void push(int value) {
		if ( value <= min() ) {
			p2.push(value);
		}
		else {
			super.push(value);
		}
	}
	
	public Integer pop() {
		int value = super.pop();
		if( value == min() ) {
			s2.pop();
		}
		return value;
	}
	
	public int min() {
		if (s2.isEmpty()) {
			return Integer.MAX_VALUE;
		}
		else {
			return s2.peek();
		}
	}
}


微软100题40题-设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。

/** * File:Test_40.java * Title: * Description: 40.百度研发笔试题(栈、算法) 引用自:zp155334877 1)设计一个栈结构,满足一下...
  • hxpjava1
  • hxpjava1
  • 2015年07月09日 13:52
  • 993

剑指Offer面试题65:滑动窗口的最大值 Java实现

题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4.4,6,6,6,5...
  • gg543012991
  • gg543012991
  • 2016年10月18日 23:10
  • 1886

《编程之美》——队列中取最大值操作的问题

问题: 假定有这样一个拥有3个操作的队列: 1. EnQueue(v): 将v加入队列中 2. DeQueue(): 使队列中的队首元素删除并返回此元素 3. MaxElement(): 返回...
  • zengzhen_CSDN
  • zengzhen_CSDN
  • 2015年11月11日 15:09
  • 978

编程之美系列之栈和队列2—在O(1)的时间内得到队列的最大或者最小值

上一篇博客http://blog.csdn.net/kay_zhyu/article/details/8869542中提到,在O(1)的时间内取得栈的最大或者最小值,作法是利用一个辅助栈去动态的维护这...
  • kay_zhyu
  • kay_zhyu
  • 2013年04月30日 15:00
  • 2828

面试题:支持O(1)时间内完成pop,push和max的栈

一般的栈,本身的pop和push的操作就是O(1)的,可以考虑使用一个变量来存储最大值。问题在于,如果这个最大值被pop出去,这个变量就需要重新计算。如果通过遍历一遍来求出,则需要O(n)的时间,达不...
  • AlburtHoffman
  • AlburtHoffman
  • 2014年01月26日 22:51
  • 9020

数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)

普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间。 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一...
  • u012653791
  • u012653791
  • 2014年02月19日 08:48
  • 1788

实现一个栈,要求push,pop,Min的操作时间复杂度为O(1)

问题:实现一个栈,要求实现Push(入栈),Pop(出栈),Min(返回最小值)的操作时间复杂度为O(1). 分析:刚看到这个题的时候,用栈来实现Min(返回最小值)的操作,我的第一反应就是必须把栈中...
  • qq_29503203
  • qq_29503203
  • 2016年09月11日 22:33
  • 752

每天学习一算法系列(3)(设计包含min函数的栈,要求函数min、push以及pop的时间复杂度都是O(1))

题目: 请设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 题目来源于:http://t...
  • yuucyf
  • yuucyf
  • 2011年04月21日 16:07
  • 3419

实现一堆栈,要求三个操作,Pop,Push,GetMaxValue,时间均为O(1)

问题描述 扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。 问题分析 拿到这道题,我们最先的思考...
  • sipherhern
  • sipherhern
  • 2016年08月11日 23:56
  • 1596

java实现栈结构

栈的定义         栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。       (1)通常称插入、删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom)。 ...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2013年01月12日 14:30
  • 25019
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】设计一个栈,并且push,pop和min三个方法的时间复杂度必须为O(1)
举报原因:
原因补充:

(最多只允许输入30个字)