力扣155. 最小棧(以空間換時間,使用輔助棧)
設計乙個支援 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.
思路:「以空間換時間」,使用輔助棧
入棧時,最小值入棧才同步;出棧時,最小值出棧才同步。
注意的點:
(1)輔助棧為空的時候,必須放入新進來的數;
(2)新來的數小於或者等於輔助棧棧頂元素的時候,才放入,特別注意這裡「等於」要考慮進去,因為出棧的時候,連續的、相等的並且是最小值的元素要同步出棧;
(3)出棧的時候,輔助棧的棧頂元素等於資料棧的棧頂元素,才出棧。
複雜度分析:
時間複雜度:o(1),「出棧」、「入棧」、「檢視棧頂元素」的操作不論資料規模多大,都只有有限個步驟,因此時間複雜度是:o(1)。
空間複雜度:o(n),這裡 n 是讀出的資料的個數。
//出棧時,最小值出棧才同步;入棧時,最小值入棧才同步。
#include "stdafx.h"
#include #include #include using namespace std;
class minstack
void push(int x)
//如果發現小於或者等於最小值的話,放進輔助棧
else
}} void pop()
//如果出棧的是最小值,那麼輔助棧的top也要出棧
//出棧的時候,輔助棧的棧頂元素等於資料棧的棧頂元素,才出棧。
else
}int top()
int getmin() };
int main()
力扣 155 最小棧
設計乙個支援 push pop top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。class minstack public void pop public int top publi...
力扣155 最小棧
設計乙個支援 push pop top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。法1 使用乙個新棧,棧頂表示原棧中最小值,每次往原棧插入時,若小於等於新棧頂,則同時插入新棧,出棧時,...
力扣 155 最小棧
設計乙個支援 push pop top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。示例 輸入 minstack push push push getmin pop top getmin...