劍指:包含min函數的棧(min棧)


題目描述

設計一個支持 push,pop,top 等操作並且可以在 O(1) 時間內檢索出最小元素的堆棧。

  • push(x)–將元素x插入棧中
  • pop()–移除棧頂元素
  • top()–得到棧頂元素
  • getMin()–得到棧中最小元素

樣例

MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin();   --> Returns -4.
minStack.pop();
minStack.top();      --> Returns 3.
minStack.getMin();   --> Returns -1.

 

 

解法

定義兩個stack,一個為存放最小數的序列的輔助棧

壓棧時,先將元素 x 壓入 stack1。然后判斷 stack2 的情況:

  • stack2 棧為空或者棧頂元素大於 x,則將 x 壓入 stack2 中。
  • stack2 棧不為空且棧定元素小於 x,則重復壓入棧頂元素。

獲取最小元素時,從 stack2 中獲取棧頂元素即可。

import java.util.Stack;

public class MinStack {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    
    public MinStack(){
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x){
        stack1.push(x);
        if(stack2.isEmpty() || stack2.peek()>x)
            stack2.push(x);
        else
            stack2.push(stack2.peek());
    }
    
    public void pop(){
        stack1.pop();
        stack2.pop();
    }
    
    public int top(){
        return stack1.peek();
    }
    
    public int getMin(){
        return stack2.peek();
    }
}
public static void main(String[] args) {
    MinStack obj = new MinStack();
    obj.push(-1);
    obj.push(3);
    obj.push(-4);
    obj.push(0);
    obj.pop();
    int param_3 = obj.top();
    int param_4 = obj.getMin();
    System.out.println(param_3+ " "+param_4);
}
View Code

 

時間復雜度:O(1)、空間復雜度:O(n)

 

 

 

 

優化

時間復雜度:O(1)、空間復雜度:O(1)

package com.lisen;
import java.util.Stack;

public class MinStack {
    private Stack<Integer> stack;
    private int min;
    
    public MinStack(){
        stack = new Stack<>();
    }
    
    public void push(int x){
        if(stack.isEmpty()){
            min = x;
            stack.push(0);
        }else{
            //計算差值
            int compareVal = x - min;
            stack.push(compareVal);
            min = compareVal < 0 ? x : min;
        }
    }
    
    public void pop(){
        int top = stack.peek();
        //如果top小於0,顯然最小值也一並被刪除,此時更新最小值
        min = top < 0 ? (min-top) : min;
        stack.pop();
    }
    
    public int getMin(){
        return min;
    }
}

 此方法在數據有限制的情況下適用,否則差值會溢出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM