題目
劍指 Offer 30. 包含min函式的棧
思路1
- 使用一個輔助棧
min_stack
,用來維護棧的最小的元素
- 每次新增元素入棧時候,
data_stack
和min_stack
都要同時維護
data_stack
按照正常的棧壓入和彈出順序,但是min_stack
棧不一樣,因為要能獲取當前棧的最小元素:
- 如果棧是空的,直接入棧
- 如果棧不是空的,分兩種情況:
- 待入棧的元素
x
小於min_stack
棧頂的元素,此時直接將x
壓入min_stack
棧
- 待入棧的元素
x
大於min_stack
棧頂的元素,此時將當前棧頂元素再次壓入棧頂
程式碼
class MinStack {
LinkedList<Integer> data_stack;
// min_stack為輔助棧
LinkedList<Integer> min_stack;
public MinStack() {
// 初始化
data_stack = new LinkedList<>();
min_stack = new LinkedList<>();
}
public void push(int x) {
data_stack.push(x);
// 入棧的時候要判斷輔助棧是否為空,空的話直接push即可
if (!min_stack.isEmpty()) {
// 判斷待入棧的元素x是否大於min_stack棧頂元素,如果小於直接入棧;若大於,則將原來棧頂的元素再次入棧一次
if (x < min_stack.peek()) {
min_stack.push(x);
} else {
min_stack.push(min_stack.peek());
}
} else {
min_stack.push(x);
}
}
public void pop() {
// 如果pop的話直接彈出去
// 這裡不用擔心min_stack輔助棧的最小元素被pop出去,因為min_stack和data_stack是一一對應的,同時pop出去對獲取當前棧的最小值沒有影響
data_stack.pop();
min_stack.pop();
}
public int top() {
// 檢視當前棧的棧頂也是直接peek
return data_stack.peek();
}
public int min() {
// 輔助棧的棧頂元素就是當前棧中的最小的元素
return min_stack.peek();
}
}
複雜度分析
- 時間複雜度:\(O(1)\)
- 空間複雜度:\(O(N)\)