这是悦乐书的第177次更新,第179篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155)。设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈。

push(x) - 将元素x推入堆栈。

pop() - 删除堆栈顶部的元素。

top() - 获取顶部元素。

getMin() - 检索堆栈中的最小元素。

例如:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.getMin(); - >返回-3。

minStack.pop();

minStack.top(); - >返回0。

minStack.getMin(); - >返回-2。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

利用整型数组和ArrayList作为栈。

入栈的时候,创建一个容量为2的数组,数组第一个元素是要入栈的元素,第二个元素是最小值,将数组添加到list中。

出栈的时候,获取list的最后一个元素,并将其移除,此时的最小值是list最后一位元素(数组)的第二个值。

获取栈顶,即是list中最后一位元素(数组)的第一个值。

最小值直接返回最小值即可。

class MinStack {

private List stack ;

private int min ;

public MinStack() {

stack = new ArrayList();

}

public void push(int x) {

int[] arr = new int[2];

arr[0] = x;

arr[1] = stack.isEmpty() ? x : Math.min(x, min);

min = arr[1];

stack.add(arr);

}

public void pop() {

if (!stack.isEmpty()) {

stack.remove(stack.size()-1);

min = stack.isEmpty() ? 0 : stack.get(stack.size()-1)[1];

}

}

public int top() {

return stack.get(stack.size()-1)[0];

}

public int getMin() {

return min;

}

}

03 第二种解法

此解法使用了栈本身和优先队列两种结构,优先队列是为了解决最小值的问题。

入栈、出栈、栈顶这些操作都可以用栈本身的方法,而最小值则是优先队列的头部元素,因为优先队列自带排序算法,在初始化时如果不指定排序方式,则默认以自然方式排序。所以在入栈时,一并也将元素放入优先队列中,而最小值就是队列的头部元素,而其他元素的顺序是不是按升序依次排列的,这个还真不一定,但是如果你通过实现Comparable接口,重写其compareTo方法,可以按照自己定义的方式来排序。

class MinStack2 {

PriorityQueue pQueue = new PriorityQueue();

Stack stack = new Stack();

public MinStack2() {}

public void push(int x) {

pQueue.add(x);

stack.push(x);

}

public void pop() {

int trmp = stack.pop();

pQueue.remove(trmp);

}

public int top() {

return stack.peek();

}

public int getMin() {

return pQueue.peek();

}

}

04 第三种解法

使用两个栈,一个作为正常的栈进行入栈、出栈、获取栈顶操作,另外一个栈则存储最小值,每次在第一个栈进行入栈和出栈操作时,都要进行判断,对第二个栈中的最小值进行相应的操作。

class MinStack3 {

private Stack s1 = new Stack<>();

private Stack s2 = new Stack<>();

public MinStack3() {}

public void push(int x) {

s1.push(x);

if (s2.isEmpty() || s2.peek() >= x) {

s2.push(x);

}

}

public void pop() {

int x = s1.pop();

if (s2.peek() == x) s2.pop();

}

public int top() {

return s1.peek();

}

public int getMin() {

return s2.peek();

}

}

05 第四种解法

较之第三种解法,此解法只使用了一个栈来完成入栈、出栈、获取栈顶和最小值的全部操作。

入栈时,如果新入栈的元素比最小值小,那么要将旧的最小值入栈,并且新的最小值是此时新入栈的元素,最后再将新元素入栈。

出栈时,如果要移除的元素正好是当前最小值,那么就需要再出栈一次,并且最小值等于第二次出栈要移除的值,因为入栈时是会将旧的最小值添加进去的,所以出栈时要做此判断。

class MinStack4 {

int min = Integer.MAX_VALUE;

Stack stack = new Stack();

public void push(int x) {

if(x <= min){

stack.push(min);

min = x;

}

stack.push(x);

}

public void pop() {

if(stack.pop() == min) {

min=stack.pop();

}

}

public int top() {

return stack.peek();

}

public int getMin() {

return min;

}

}

06 小结

算法专题目前已连续日更超过一个月,算法题文章35+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

min java_LeetCode算法题-Min Stack(Java实现)相关推荐

  1. leetcode 用java_LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. 【蓝桥杯算法题】用java遍写税收计算

    [蓝桥杯算法题]用java遍写税收计算 题目:劳务报酬税收计算:输入 m ,输出税后收入.如果 m <=800,不扣税, 如果800< m <=4000.则 m 减去800后的金额扣 ...

  3. largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  4. add binary java_LeetCode算法题-Add Binary(Java实现)

    这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...

  5. power of two java_LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  6. magic square java_LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

  7. island of java_LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  8. quadtree java_LeetCode算法题-Quad Tree Intersection(Java实现)

    这是悦乐书的第260次更新,第273篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第127题(顺位题号是558).四叉树是树数据,其中每个内部节点恰好有四个子节点:top ...

  9. quadtree java_LeetCode算法题-Construct Quad Tree(Java实现)

    这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...

最新文章

  1. 1.4)深度学习笔记------深层神经网络
  2. python 二维码_Python提取支付宝和微信支付二维码
  3. 利用ssh-agent提升ansible使用的方便及安全性
  4. APScheduler Scheduler
  5. 六种方法帮你解决模型过拟合问题
  6. mac 安装android sdk
  7. Maven生命周期和插件
  8. php可以写无缝轮播图吗,怎样用css实现无缝轮播图切换?
  9. 如何评价周志华老师的新书《机器学习理论导引》“宝箱书”?
  10. mbedtls学习3.mbedtls_API分析
  11. 树莓派python 简介_自己动手实现智能家居之树莓派GPIO简介(Python版)
  12. 开始学习英语的七个步骤。
  13. PyQt5_pyqtgraph股票MACD指标
  14. 宏基Acer笔记本热销火热机
  15. Unity3D for VR 学习(7): 360°全景照片
  16. 数学建模(一)对变化进行建模及其解
  17. LCD LVDS BT656 SDI
  18. iOS - CodeReview 代码评审
  19. 如何在使用Latex包pdfpages合并后的pdf文件中显示页码
  20. 一文详解:TMP1750芯片 三通道线性LED驱动器

热门文章

  1. 汉字在线转化unicode编码
  2. 4.3.1 jQuery基础(1)
  3. google的几个搜索业务
  4. 解决E1776:无法引用 函数 “A::A(const A)“ (已隐式声明) -- 它是已删除的函数
  5. leetcode —— 200. 岛屿数量
  6. 数据结构——归并排序
  7. Java中String.split和StringUtils.split性能比较
  8. TF-IDF的java实现(权重排序,可用来处理大数据集)
  9. OpenCV--Mat类相关操作
  10. 截取视频段转换为GIF动图