题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数。在该栈中。调用min、push 及pop的时间复杂度都是0(1)


解题思路:

把每次的最小元素(之前的最小元素和新压入战的元素两者的较小值)都保存起来放到另外一个辅助栈里

假设每次都把最小元素压入辅助栈, 那么就能保证辅助栈的栈顶一直都是最小元素.当最小元素从数据栈内被弹出之后,同一时候弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。

代码实现:

  1. public class Test21 {
  2. /**
  3. * 定义栈的数据结构,请在该类型中实现一个可以得到校的最小元素的min函数。
  4. * 在该栈中。调用pop、push 及min的时间复杂度都是0(1)
  5. *
  6. * @param <T> 泛型參数
  7. */
  8. public static class StackWithMin<T extends Comparable<T>> {
  9. // 数据栈,用于存放插入的数据
  10. private Stack<T> dataStack;
  11. // 最小数位置栈,存放数据栈中最小的数的位置
  12. private Stack<Integer> minStack;
  13. // 构造函数
  14. public StackWithMin() {
  15. this.dataStack = new Stack<>();
  16. this.minStack = new Stack<>();
  17. }
  18. /**
  19. * 出栈方法
  20. * @return 栈顶元素
  21. */
  22. public T pop() {
  23. // 假设栈已经为空。再出栈抛出异常
  24. if (dataStack.isEmpty()) {
  25. throw new RuntimeException("The stack is already empty");
  26. }
  27. // 假设有数据。最小数位置栈和数据栈必然是有同样的元素个数,
  28. // 两个栈同一时候出栈
  29. minStack.pop();
  30. return dataStack.pop();
  31. }
  32. /**
  33. * 元素入栈
  34. * @param t 入栈的元素
  35. */
  36. public void push(T t) {
  37. // 假设入栈的元素为空就抛出异常
  38. if (t == null) {
  39. throw new RuntimeException("Element can be null");
  40. }
  41. // 假设数据栈是空的,仅仅接将元素入栈,同一时候更新最小数栈中的数据
  42. if (dataStack.isEmpty()) {
  43. dataStack.push(t);
  44. minStack.push(0);
  45. }
  46. // 假设数据栈中有数据
  47. else {
  48. // 获取数据栈中的最小元素(未插入t之前的)
  49. T e = dataStack.get(minStack.peek());
  50. // 将t入栈
  51. dataStack.push(t);
  52. // 假设插入的数据比栈中的最小元素小
  53. if (t.compareTo(e) < 0) {
  54. // 将新的最小元素的位置入最小栈
  55. minStack.push(dataStack.size() - 1);
  56. } else {
  57. // 插入的元素不比原来的最小元素小,复制最小栈栈顶元素,将其入栈
  58. minStack.push(minStack.peek());
  59. }
  60. }
  61. }
  62. /**
  63. * 获取栈中的最小元素
  64. * @return 栈中的最小元素
  65. */
  66. public T min() {
  67. // 假设最小数公位置栈已经为空(数据栈中已经没有数据了),则抛出异常
  68. if (minStack.isEmpty()) {
  69. throw new RuntimeException("No element in stack.");
  70. }
  71. // 获取数据栈中的最小元素。而且返回结果
  72. return dataStack.get(minStack.peek());
  73. }
  74. }
  75. public static void main(String[] args) {
  76. StackWithMin<Integer> stack = new StackWithMin<>();
  77. stack.push(3);
  78. System.out.println(stack.min() == 3);
  79. stack.push(4);
  80. System.out.println(stack.min() == 3);
  81. stack.push(2);
  82. System.out.println(stack.min() == 2);
  83. stack.push(3);
  84. System.out.println(stack.min() == 2);
  85. stack.pop();
  86. System.out.println(stack.min() == 2);
  87. stack.pop();
  88. System.out.println(stack.min() == 3);
  89. stack.push(0);
  90. System.out.println(stack.min() == 0);
  91. }
  92. }

执行结果:

【剑指Offer学习】【面试题21:包括min 函数的栈】的更多相关文章

  1. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

  2. 《剑指offer》面试题21 包含min函数的栈 Java版

    (min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...

  3. 《剑指offer》面试题30. 包含min函数的栈

    问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).   示例: MinStack minSt ...

  4. 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面

    面试题 21. 调整数组顺序使奇数位于偶数前面

  5. 《剑指offer》面试题21. 调整数组顺序使奇数位于偶数前面

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] ...

  6. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  7. (剑指Offer)面试题21:包含min函数的栈

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 在该栈中,调用min,push,pop的时间复杂度都是O(1) 思路: 1.除了原来的栈s,增加一个辅助栈s_min,用 ...

  8. 剑指offer-面试题21.包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ...

  9. (剑指Offer)面试题7:用两个栈实现队列

    题目: 用两个栈实现一个队列. 队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 根据栈的“先进后出”特点, ...

  10. 剑指offer笔记面试题1----赋值运算符函数

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ...

随机推荐

  1. 定制滚动条样式 webkit

    ::-webkit-scrollbar              { /* 1 */ } ::-webkit-scrollbar-button       { /* 2 */ } ::-webkit- ...

  2. JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Windows系统下python3中安装pyMysql

    python2和python3是不兼容的,在py2中,链接数据库使用的是mysqldb,但在py3中是不能用的. 解决办法就是在py3中数据库使用的模块是pyMysql. 在dos窗口中安装第三方库会 ...

  4. flask中使用xlsxwriter导出excel文件

    最近需要使用flask导出xlsxwriter生成的excel文件,在文件比较小的情况下,可以直接导出. 首先,这里使用了StringIO,导出使用的模块 import xlsxwriter impo ...

  5. 如何将一个div水平垂直居中?4种方法做推荐

    方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...

  6. php 例子 如何转换ISO8601为 utc时间

    //firstpowertime "2017-01-02T13:22:22" 获取时间$firstpowertime=$list[$i]['firstpowertime'];//判 ...

  7. mongoose返回值无法修改

    mongoose 查询方法 find 例:db.collections.find(query,function(err,doc) { 如果var res = doc[0]  是{name:'feife ...

  8. MySQL5.6新特性

    Innodb加强项 1.Innodb全文索引 mysql> show create table film_text\G . row *************************** Tab ...

  9. 从零一起学Spring Boot之LayIM项目长成记(五)websocket

    前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...

  10. Kaggle实战之一回归问题

    0. 前言 1.任务描述 2.数据概览 3. 数据准备 4. 模型训练 5. kaggle实战 0. 前言 "尽管新技术新算法层出不穷,但是掌握好基础算法就能解决手头 90% 的机器学习问题 ...