1. 程式人生 > 其它 >LeetCode--最小棧

LeetCode--最小棧

技術標籤:leetcode

題目

設計一個支援 push ,pop ,top 操作,並能在常數時間內檢索到最小元素的棧。

push(x) —— 將元素 x 推入棧中。
pop() —— 刪除棧頂的元素。
top() —— 獲取棧頂元素。
getMin() —— 檢索棧中的最小元素。

示例:

輸入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[
[],[-2],[0],[-3],[],[],[],[]] 輸出: [null,null,null,null,-3,null,0,-2] 解釋: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.

提示:
pop、top 和 getMin 操作總是在 非空棧 上呼叫。

思路

使用一個數據棧和輔助棧,輔助棧用以儲存最小元素的變化值。例如輸入[2, 0, 1],則最小值變化兩次,輔助棧中儲存[2, 0]。記憶該例子即可寫出程式碼
主要是對於入棧和出棧時需要有所設計

題解

入棧時,需比較的是x <= help.top(),注意等號
c++

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> data;
    stack<int> help;
    MinStack() {
        stack<int>
data; stack<int> help; } void push(int x) { data.push(x); if (help.empty() || x <= help.top()) help.push(x); //空解決第一次入棧的問題,並且注意是小於等於 } void pop() { if (data.top() == help.top()) { data.pop(); help.pop(); } else data.pop(); } int top() { return data.top(); } int min() { return help.top(); } };

java
注意點:

  1. peek與pop的區別
  2. data.peek返回的是包裝類Integer,需要用其類方法.equals()來比較值是否相同

此題如果用==將會無法通過 Integer的equals重寫過,比較的是內部value的值, ==如果在[-128,127]會被cache快取,超過這個範圍則比較的是物件是否相同

class MinStack {
    Stack<Integer> data;  //Java中Stack為一個標準類,因此大寫開頭
    Stack<Integer> help;
    /** initialize  your data structure here. */
    public MinStack() {
        data = new Stack<Integer>();
        help = new Stack<Integer>();
    }

    public void push(int x) {
        data.push(x);
        if (help.empty() || x<=help.peek()) help.push(x);  //Java中檢視棧頂叫peek(挺形象的),pop會出棧
    }

    public void pop() {
        if (data.peek().equals(help.peek())) help.pop();
        data.pop();
    }

    public int top() {
        return data.peek();
    }

    public int min() {
        return help.peek();
    }
}

複雜度

時間複雜度空間複雜度
O(1)O(1)