LeetCode Java刷题笔记—155. 最小栈

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—155. 最小栈相关的知识,希望对你有一定的参考价值。

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. 最小栈的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 栈 - 最小栈, leetcode 155

LeetCode刷题笔记-数据结构-day14

LeetCode刷题笔记-数据结构-day14

Leetcode刷题Python155. 最小栈

刷题记录 leetcode155:最小值栈

c++刷题——leetcode.155 最小栈