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();
}
}