实现桟的push和pop操作,以及桟的min操作返回桟中的最小值,要求这三个操作的时间复杂度均为O(1)。

在Java中可以使用LinkedList实现桟的各种操作,这里使用双向链表实现桟的push和pop操作,这两个操作都能维持O(1)的时间复杂度,但是对于求桟中元素的最小值,最容易想到的方法是遍历整个桟,然后返回,但此时的时间复杂度为O(n),要想省下时间复杂度,则必须牺牲空间复杂度,所以可以再维护一个和桟大小相同的数据结构(可以是链表,动态数组或者一个新的桟)来存储每个元素入桟之后对应的桟中的最小元素,在对桟执行push和pop操作时,这个数据结构也跟着变化,这样就能以O(1)的时间复杂度实现min操作了。

public class Stack1<Key extends Comparable<Key>> {
private Node top;
private Node minTop; private class Node {
Key key;
Node next;
Node prev;
Node(Key key, Node next, Node prev) {
this.key = key;
this.next = next;
this.prev = prev;
}
} /* 元素入桟,因为要求桟的push,pop以及min操作都为O(1)操作,所以
* 在元素入桟时还要维护一个min桟 */
public void push(Key key) {
if (top == null) {
top = new Node(key, null, null);
top.next = null;
top.prev = null;
pushMin(key);
return;
} Node x = new Node(key, null, top);
top.next = x;
top = x;
pushMin(key);
} /* 维护一个最小元素的桟 */
private void pushMin(Key key) {
if (minTop == null) {
minTop = new Node(key, null, null);
minTop.next = null;
return;
} if (key.compareTo(minTop.key) < 0) {
Node x = new Node(key, null, minTop);
minTop.next = x;
minTop = x;
} else {
Node x = new Node(minTop.key, null, minTop);
minTop.next = x;
minTop = x;
}
} /* 元素出桟,因为要求桟的push,pop以及min操作都为O(1)操作,所以
* 在元素入桟时还要维护一个min桟 */
public Key pop() {
if (top == null) {
return null;
} Key key = top.key;
if ((top.prev == null) && (top.next == null)) {
top = null;
popMin();
return key;
} top = top.prev;
top.next = null;
popMin();
return key;
} /* 返回桟中的最小元素 */
private Key popMin() {
if (minTop == null) {
return null;
} Key key = minTop.key;
if ((minTop.prev == null) && (minTop.next == null)) {
minTop = null;
return key;
} minTop = minTop.prev;
minTop.next = null;
return minTop.key;
} /* 返回桟的最小元素 */
public Key min() {
/* 注意边界条件,当维护的桟为空时minTop也为空 */
if (minTop == null) {
return null;
}
return minTop.key;
} public static void main(String[] args) { Stack1<Integer> stack1 = new Stack1<Integer>();
stack1.push(11);
stack1.push(23);
stack1.push(4);
stack1.push(76);
stack1.push(13);
stack1.push(42);
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
System.out.println(stack1.min() + " " + stack1.pop());
}
}

上面main函数的输出为:

4 42
4 13
4 76
4 4
11 23
11 11
null null

桟的min实现:O(1)时间复杂度的更多相关文章

  1. 【老鸟学算法】包含 min函数的栈设计——java实现

    要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素. 2. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 这是考验“栈”数据结构设计.众所周知,栈 ...

  2. O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素(转)

    题目要求:定义栈的数据结构,添加min().max()函数(动态获取当前状态栈中的最小元素.最大元素),要求push().pop().min().max()的时间复杂度都是O(1). 思路解析:根据栈 ...

  3. 2.11 2D平面最近点对问题[closest pair problem]

    [本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...

  4. Lintcode: Kth Smallest Number in Sorted Matrix

    Find the kth smallest number in at row and column sorted matrix. Example Given k = 4 and a matrix: [ ...

  5. 剑指offer系列18---顺时针打印矩阵

    [题目]定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.要求时间复杂度是O(1).push pop min [思路]设计一个辅助栈,当新加入的原数据栈中的数小于辅助栈顶的数时就加 ...

  6. 剑指offer—第二章算法之二分查找(旋转数组的最小值)

    旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...

  7. AGC010 - D: Decrementing

    原题链接 题意简述 给出一个个数的序列,足够聪明的AB两人轮流进行以下操作: 令一个大于1的数减1,然后所有数除以. 如果一个人不能操作了,那么他就输了. 输入保证所有数都是正整数并且. 分析 这是一 ...

  8. 剑指Offer--排序算法小结

    剑指Offer--排序算法小结 前言 毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试.电面.面试. 许久未接触排序算法了.平时偶尔接触到时自己会不假思索的百度,然后就是 ...

  9. 《剑指offer》内容总结

    (1)剑指Offer——Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...

随机推荐

  1. 制作ubuntu安装u盘

    Ubuntu官方中文译名为友帮拓,是一款开源免费的linux操作系统.与其他的linux操作系统不同之处在于Ubuntu的软件包清单只包含那些高质量的重要应用程序,因此深受广大linux用户的喜爱,那 ...

  2. 如何开发 Sublime Text 2 的插件

    Sublime Text 2是一个高度可定制的文本编辑器,一直以来对希望有一个快速强大现代的编辑工具的的程序员保持着持续的吸引力.现在,我们将创建自己的一个Sublime plugin,实现用Nett ...

  3. Linux下如何查看自己的服务器有没有无线网卡

    还是实验室那台破服务器,连不上网.有没有界面,所以想着如何用一些命令来链接上热点. 当然,在linux下链接wifi没有win下那么一点就好了! 首先我们需要的基本条件就是: 服务器上有无线网卡.[r ...

  4. C/C++源代码到可执行程序的过程详解

    编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 源代码-- ...

  5. Tomcat数据库连接池的配置方法总结

    Tomcat数据库连接池的配置方法总结 数据库连接是一种关键的有限的昂贵的资源,这在多用户网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标 ...

  6. mysql 添加字段、删除字段、调整字段顺序 转

    ALTER TABLE — 更改表属性添加字段: alter table `user_movement_log`Add column GatewayId int  not null default 0 ...

  7. Objective-C:Foundation框架-常用类-NSDictionary

    与NSString.NSArray一样,NSDictionary是不可变的,其对应可变类型为NSMutableDictionary.其用法如下: #import <Foundation/Foun ...

  8. Front End中Javascript兼容问题收集(转)

    1 select标签,就有诸多不兼容: A. cloneNode方法,对于非IE浏览器没有问题,对于IE浏览器, 遇到的问题包括:     1)option selected的会clone不过去,然后 ...

  9. was7中文redhat6上安装出现中文乱码解决方案

    转:http://blog.csdn.net/w1985g/article/details/8789378 在rhel-server-6.1-x86_64上安装WebSphere 7时,安装界面出现中 ...

  10. Could not find artifact com.sun:tools:jar:1.5.0

    问题: Failed to execute goal on project petroleum: Could not resolve dependencies for project petroleu ...