設計問題-最小棧

設計一個支持 push ,pop ,top 操作,并能在常數(shù)時間內(nèi)檢索到最小元素的棧。

push(x) —— 將元素 x 推入棧中。
pop() —— 刪除棧頂?shù)脑亍?br> 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.

輔助棧

復雜度分析

  • 時間復雜度:對于題目中的所有操作,時間復雜度均為 O(1)。因為棧的插入、刪除與讀取操作都是 O(1),我們定義的每個操作最多調用棧操作兩次。
  • 空間復雜度:O(n),其中 n 為總操作數(shù)。最壞情況下,我們會連續(xù)插入 n 個元素,此時兩個棧占用的空間為 O(n)。

設定兩個數(shù)組,一個是作為棧,一個是記錄最小當前最小值的輔助棧數(shù)組
數(shù)據(jù)棧和輔助棧的數(shù)據(jù)要同步添加,出棧也是要同步出,這樣才能保證數(shù)據(jù)一 一對應

  push(-2)                push(0)           push(-3)            pop()             top()
                                          -3       -3
                        0       -2         0       -2        0       -2         0       -2
-2       -2            -2       -2        -2       -2       -2       -2        -2       -2
stack  minStack      stack  minStack     stack  minStack   stack  minStack     stack  minStack 
type MinStack struct {
    stack []int
    minStack []int
}


/** initialize your data structure here. */
func Constructor() MinStack {
    return MinStack{
         stack : []int{},
         minArr : []int{math.MaxInt64},//記錄最小棧
    }
}


func (this *MinStack) Push(x int)  {
    this.stack = append(this.stack,x)  //將元素添加入棧內(nèi)
    min := this.minArr[len(this.minArr) - 1] //獲取最小棧中最頂層的最小值
    this.minArr = append(this.minArr,Min(min,x))//比較后,將最小值入棧 
}


func (this *MinStack) Pop()  {
    //出棧操作,兩邊都需要出棧,保證兩邊數(shù)據(jù)同步一一對應
    this.stack = this.stack[:len(this.stack)-1]
    this.minArr = this.minArr[:len(this.minArr)-1]

}


func (this *MinStack) Top() int {
    return this.stack[len(this.stack)-1]
}


func (this *MinStack) GetMin() int {
    return this.minArr[len(this.minArr)-1]
}
func Min(a,b int) int{
    if a > b {
        return b
    }
    return a
}

/**
 * Your MinStack object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * obj.Pop();
 * param_3 := obj.Top();
 * param_4 := obj.GetMin();
 */
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容