演算法題

桂圓桂圓車釐子發表於2020-10-18

1.實現一個特殊的棧,在實現棧的基本功能基礎上,在實現返回棧中最小元素的操作

要求:

  • pop、push、getMin操作時間複雜度都為O(1)
  • 設計棧型別可以用現成的棧結構
思路一:

可以設計兩個棧,其中一個棧的為stackData,另一個棧為stackMin

入棧:假設入棧值為nuwNum

直接入棧stackData中,之後判斷stackMIn是否為空,如果為空,則也入棧stackMin,否則就要判斷stackMin棧頂元素和newNum的大小
如果stackMin棧頂的值更小,那麼newData就不入棧,否則就入棧stackMin(就能保證stackMin棧頂值最小)

出棧

與入棧類似,先判斷stackData是否為空,如果為空,throw報錯,
如果不為空,設定一個value變數等於stackData.pop
因為value的值一定大於等於stackMin棧頂的值,判斷
如果value == stackMin.peek() 那麼 stackMin.pop()
否則,return value

獲取最小值

stackMin的棧頂就是最小值
程式碼:

import java.util.Stack;

/*
* 實現一個特殊的棧,在實現棧的基本功能基礎上,在實現返回棧中最小元素的操作
* 要求:
*   pop、push、getMin操作時間複雜度都為O(1)
*   設計棧型別可以用現成的棧結構
* */
public class MyStack1 {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack1(Stack<Integer> stackData, Stack<Integer> stackMin) {
        this.stackData = stackData;
        this.stackMin = stackMin;
    }

    // 要求壓棧的時間複雜度為O(1)
    public void push(Integer newNum){
        stackData.push(newNum);
        // 判斷stackMin是否為空:
        if (stackMin.empty()){
            // 如果為空
            // 也壓入
            stackMin.push(newNum);
        }else if (newNum <= stackMin.peek()){// 如果不為空 看newNum和stackMin棧頂的兩個元素哪個更小
            // 如果newNum更小或兩者相等,就壓入stackMin
            // 如果stackMin棧頂元素更小,不壓入任何內容
            stackMin.push(newNum);
        }else {
            return;
        }
    }
    // 出棧
    public Integer pop(){
        if (stackData.empty()){
            throw new RuntimeException("This stack is empty");
        }
        int value = stackData.pop();// 這裡一定是pop不能是peek,否則不會出棧
        // 判斷 value和stackMin棧頂的大小
        // value一定大於等於stackMin棧頂的值,如果等於,stackMin彈出,否則value彈出
        if (value == stackMin.peek()){
            stackMin.pop();
        }
        return value;
    }
    // 獲取最小值
    public Integer getMin(){
        if (stackMin.empty()){
            throw new RuntimeException("no min Integer");
        }else {
            return stackMin.peek();
        }
    }
}

測試:

package org.yyx.it.getMinStack.test;

import org.yyx.it.getMinStack.MyStack1;

import java.util.Stack;

public class TestMyStack1 {
    public static void main(String[] args) {
        Stack<Integer> stackData = new Stack<>();
        Stack<Integer> stackMin = new Stack<>();
        MyStack1 myStack1 = new MyStack1(stackData,stackMin);
        myStack1.push(3);
        myStack1.push(1);
        myStack1.push(4);
        myStack1.push(2);
        myStack1.push(5);
        myStack1.push(1);
        System.out.println(myStack1.getMin());
        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
        System.out.println(myStack1.pop());
    }
}

相關文章