LeetCode--最小棧
阿新 • • 發佈:2021-02-02
技術標籤:leetcode
題目
設計一個支援 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.
提示:
pop、top 和 getMin 操作總是在 非空棧 上呼叫。
思路
使用一個數據棧和輔助棧,輔助棧用以儲存最小元素的變化值
。例如輸入[2, 0, 1],則最小值變化兩次,輔助棧中儲存[2, 0]。記憶該例子即可寫出程式碼
主要是對於入棧和出棧時需要有所設計
題解
入棧時,需比較的是x <= help.top(),注意等號
c++
class MinStack {
public:
/** initialize your data structure here. */
stack<int> data;
stack<int> help;
MinStack() {
stack<int> data;
stack<int> help;
}
void push(int x) {
data.push(x);
if (help.empty() || x <= help.top()) help.push(x); //空解決第一次入棧的問題,並且注意是小於等於
}
void pop() {
if (data.top() == help.top()) {
data.pop();
help.pop();
}
else data.pop();
}
int top() {
return data.top();
}
int min() {
return help.top();
}
};
java
注意點:
- peek與pop的區別
- data.peek返回的是包裝類
Integer
,需要用其類方法.equals()來比較值是否相同
此題如果用==將會無法通過 Integer的equals重寫過,比較的是內部value的值, ==如果在[-128,127]會被cache快取,超過這個範圍則比較的是物件是否相同
class MinStack {
Stack<Integer> data; //Java中Stack為一個標準類,因此大寫開頭
Stack<Integer> help;
/** initialize your data structure here. */
public MinStack() {
data = new Stack<Integer>();
help = new Stack<Integer>();
}
public void push(int x) {
data.push(x);
if (help.empty() || x<=help.peek()) help.push(x); //Java中檢視棧頂叫peek(挺形象的),pop會出棧
}
public void pop() {
if (data.peek().equals(help.peek())) help.pop();
data.pop();
}
public int top() {
return data.peek();
}
public int min() {
return help.peek();
}
}
複雜度
時間複雜度 | 空間複雜度 |
---|---|
O(1) | O(1) |