示例:
minstack minstack = new minstack();
minstack.push(-2);
minstack.push(0);
minstack.push(-3);
minstack.min(); --> 返回 -3.
minstack.pop();
minstack.top(); --> 返回 0.
minstack.min(); --> 返回 -2.
2.1 思路分析
普通棧的push與pop函式時間複雜度為o(1),而獲取棧的最小值min()函式需要遍歷整個棧,時間複雜度為o(n);
若將min()函式的降低為o(1),那麼需要設定輔助棧:
資料棧a:棧a用於儲存元素;
資料棧b:棧b用於儲存棧a中所有非嚴格降序的元素,則棧a中的最小原始終對應棧b的棧頂元素,即min()函式只需要返回 棧b的棧頂元素即可。
3.函式設計:
(1)push(x)函式:重點維護棧b的非嚴格降序
1.將元素x壓入到棧a;
2.若棧b為空或者x小於等於(如果只是小於,那麼棧a中的重複的最小元素出棧時,會導致棧b空棧異常)棧b的棧頂元素,那麼將x壓入棧b;
(2)pop()函式:重點保證棧a和棧b的元素一致性
1.執行棧a出棧,出棧元素記為y;
2.若y等於棧b的棧頂元素,說明最小元素出棧了,要更新棧b,則將執行棧b出棧。
(3)top()函式:直接返回a的棧頂元素。
(4)min()函式:直接返回b的棧頂元素。
2.2 **實現
class minstack
public void push(int x)
}public void pop()
}public int top()
public int min()
}/**
* your minstack object will be instantiated and called as such:
* minstack obj = new minstack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
2.3 複雜度分析
3.1 思路分析
寫乙個鍊錶類,其成員包括val、min、next,分別是當前節點的值、鍊錶中節點最小值、指向下乙個節點的指標;
push方法:不斷增加鍊錶節點(按照...③--->②--->①--->null的方式從右向左新增節點)且更新最小值的過程;
min方法:返回鍊錶的成員min的值;
3.2 **實現
class node
}class minstack
public void push(int x) else
}public void pop()
public int top()
public int min()
}
3.3 複雜度分析 js 包含min函式的棧 包含min函式的棧
目標 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min push 及 pop 的時間複雜度都是 o 1 設計思路 我們要做的是在我們每次資料入棧的時候,記錄當前資料棧中最小值,並且在pop 出棧之後依然能找到最小值 方案 如果只用乙個 min 變數來儲...
包含min函式的棧
題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 n代表將要輸入的操作的步驟數。接下來有n行,每行開始有乙個字母ci。ci s 時,接下有乙個數字k,代...
包含min函式的棧
1.問題描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的函式,在該棧中呼叫min,push及pop的時間複雜度都為o 1 來自 劍指offer 2.分析 我們可以使用乙個輔助棧,專門來處理題目中得到棧的最小元素的函式時間複雜度為o 1 的這個需求。當我們壓棧時,另外乙個棧正常進行,...