LeetCode Java刷题笔记—155. 最小栈
Posted 刘Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—155. 最小栈相关的知识,希望对你有一定的参考价值。
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
简单难度。由于需要再常数时间检索到最小值,那么我们需要在每次添加或者删除栈元素之后立即得到最小值,因此我们需要再每次添加元素之后保存当前的最小值。
因此,我们每次入栈2个元素,一个是入栈的元素本身,一个是当前栈元素的最小值,最小栈始终保证最小值在顶部,出栈同样是每次出栈两个元素。
/**
* 155. 最小栈
* 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
* https://leetcode-cn.com/problems/min-stack/
* 简单
*/
class MinStack
private Stack<Integer> stack;
int min;
public MinStack()
stack = new Stack<Integer>();
/**
* 入栈两个元素,保证栈顶始终是当前元素中的最小值
*/
public void push( int val )
//第一次存放两个相同的
if( stack.isEmpty() )
stack.push( val );
stack.push( val );
else
//后续存放当前值,以及当前最小值
int tmp = stack.peek();
stack.push( val );
stack.push( Math.min( tmp, val ) );
/**
* 出栈两次
*/
public void pop()
stack.pop();
stack.pop();
/**
* 这里需要获取真正的栈顶元素,也就是栈顶元素的下一个元素
*/
public int top()
return stack.get( stack.size() - 2 );
/**
* 常量时间内即可获取最小元素
*/
public int getMin()
return stack.peek();
另外,在英文leetcode中有一种高票解法,使用链表实现,不借助现成的辅助结构,但需要自定义一个辅助类。
class MinStack
private Node head;
public void push( int x )
if( head == null ) head = new Node( x, x );
else head = new Node( x, Math.min( x, head.min ), head );
public void pop()
head = head.next;
public int top()
return head.val;
public int getMin()
return head.min;
/**
* 辅助内部类
*/
private class Node
//当前节点的值
int val;
//当前节点加入之后的最小值
int min;
//后继
Node next;
private Node( int val, int min )
this( val, min, null );
private Node( int val, int min, Node next )
this.val = val;
this.min = min;
this.next = next;
以上是关于LeetCode Java刷题笔记—155. 最小栈的主要内容,如果未能解决你的问题,请参考以下文章