棧和隊列——020包含min函數的棧

1,問題描述

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1))。

2,解題思路

em。。。。我覺得這道題的難點是題意理解上,只要把問題理解了,那解題思路還是較簡單的。

這道題是讓我們設計一個棧結構(此時的Solution類就是我們要設計的棧對象,最後牛客系統測試的時候也是將Solution當作一個棧對象來操作),這個棧除了包含常用的“彈出”、“查看”、“壓入”操作,還要求包含一個能夠讓我們隨時查看棧最小元素的min函數,並且時間複雜度爲O(1)。

ok,題意理解了,那解題思路就簡單了。首先題目要求時間複雜度是O(1),並且隱含條件是,我們調用min()函數時不能改變棧中元素的順序,所以我們考慮使用輔助棧。

一共需要兩個棧,其中一個是存放數據的(我們命名爲數據棧,用stData表示),另一個是存放當前數據棧最小元素的(我們命名爲最小棧,用stMin表示)。那麼怎麼才能隨時獲取到棧的最小元素呢?

答案如下:只需要在push操作的時候做些手腳就行。新來一個元素node,首先將該元素push進數據棧中,然後判斷該元素是否小於等於最小棧的棧頂元素,如果滿足小於等於,則最小棧push該元素,否則最小棧push最小棧的棧頂元素。這樣操作下來,不管如何push,如何pop,數據棧和最小棧的元素總是相等的,而且最小棧的棧頂元素就是當前數據棧中最小的元素。

看源碼更簡單易懂,這裏給出牛客網的一個測試用例:

3,源碼

import java.util.Stack;

public class Solution {
    Stack<Integer> stData = new Stack<Integer>();
    Stack<Integer> stMin = new Stack<Integer>();

    public void push(int node) {
        stData.push(node);
        if(!stMin.isEmpty()) {
            if(node<=stMin.peek()) {
                stMin.push(node);
            }else {
                stMin.push(stMin.peek());
            }
        }else {
            stMin.push(node);
        }
    }

    public void pop() {
        stData.pop();
        stMin.pop();
    }

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章