实现O(1)获取最大最小值的栈----java
原文:http://blog.csdn.net/sheepmu/article/details/38459165
实现O(1)获取最大最小值的栈和队列----java
一.如何实现包含获取最小值函数的栈
问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1).
最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。O(1)
最大值思路:同上O(1)
中间值思路:对栈排序,取中间值,但是时间不是O(1)
- package com.sheepmu;
- import java.util.Arrays;
- import java.util.Stack;
- public class SpecialStack<E extends Comparable<E>>
- {
- Stack<E> stack1=new Stack<E>();
- Stack<E> stackMin=new Stack<E>();//存放求最小值的栈
- Stack<E> stackMax=new Stack<E>();//存放求最大值的栈
- public void push(E e)
- {
- stack1.push(e);
- if(stackMin.isEmpty()||e.compareTo(stackMin.peek())<0)
- stackMin.push(e);//若最小栈为空push进stack时就同时把它push进stackMin;
- else if(e.compareTo(stackMin.peek())>0)
- stackMin.push(stackMin.peek());
- if(stackMax.isEmpty()||e.compareTo(stackMin.peek())>0)
- stackMax.push(e);
- else if(e.compareTo(stackMax.peek())<0)
- stackMin.push(stackMax.peek());
- }
- public E pop()//一定要记着,非空才能pop()
- {
- if(!stack1.isEmpty()&&!stackMin.isEmpty()&&!stackMax.isEmpty())
- {
- E e=stack1.pop();
- stackMin.pop();
- stackMax.pop();
- return e;
- }
- else
- {
- System.out.println("栈已经为空了");
- return null;
- }
- }
- public E getMin()
- {
- return stackMin.peek();
- }
- public E getMax()
- {
- return stackMax.peek();
- }
- public E getMed()
- {
- E[] ss=stack1.toArray(new E[stack.size()]);//stack1.toArray()返回的是Object[], 栈----->数组;不能toArray后再强制转换,会报错
- Arrays.sort(ss);
- return ss[ss.length/2];
- }
- }
实现O(1)获取最大最小值的栈----java的更多相关文章
- 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)
面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...
- JavaScript获取数组最小值和最大值的方法
本文实例讲述了JavaScript获取数组最小值和最大值的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 var arr = new Array(); arr[0] = 100; ...
- paip.获取文件名从路径uapi java python php总结...
paip.获取文件名从路径uapi java python php总结... =====uapi basename_noext($fname); =============java 自己写.. St ...
- 20155301-滕树晨 第二次随笔作业--从现有技能获取的经验应用于JAVA中
第二次随笔--从现有技能获取的经验应用于JAVA中 你有什么技能比大多人(超过90%以上)更好? 这个想了半天,有一个是我乒乓球还是比较擅长的,在学校里可能比百分之90的人要强,在外面肯定是不如了.再 ...
- 两个栈实现队列+两个队列实现栈----java
两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net 1. -catalog与schema的设计区别1 ...
- Java虚拟机栈(java stack)
虚拟机栈(java stack) 百度图片搜索里的动图搜索功能不错,可以搜索一些动图,展示操作数栈的操作过程,比较形象.这点google差点意思 虚拟机栈(jvm stacks)是线程独占的 里面是多 ...
- C# 之 将string数组转换到int数组并获取最大最小值
1.string 数组转换到 int 数组 " }; int[] output = Array.ConvertAll<string, int>(input, delegate(s ...
- 剑指Offer:面试题21——包含min函数的栈(java实现)
问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...
随机推荐
- EventSource (node.js 与 OC)
node.js服务器代码: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, ...
- 3D游戏调研
坦克大战3D http://s5.3d.tank365.com/tank.do?timestamp=1377220437056 深渊 http://sy.xd.com/
- dom 动态生产表格
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- SQL Server 非聚集索引的覆盖,连接,交叉和过滤 <第二篇>
在SQL Server中,非聚集索引其实可以看做是一个含有聚集索引的表,但相对实际的表来说,非聚集索引中所存储的表的列数要少得多,一般就是索引列,聚集键(或RID).非聚集索引仅仅包含源表中的非聚集索 ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- Python输入输出(IO)
程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的 ...
- Session和Cookie的分析与区别
首先说一下Web.config文件中的cookieless="false"的理解 cookieless="false"表示: 如果用户浏览器支持cookie时启 ...
- GridView九宫图
了解下 <!--android:numColumns="auto_fit"--列数设置为自动: android:columnWidth="90dp"--每 ...
- opencv直方图均衡化
#include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...
- Javascript(JS)对Cookie的读取、删除、写入操作帮助方法
var CookieUtils = { get: function (name) { var cookieName = encodeURIComponent(name) + '=', cookieSt ...