栈#中等#最小栈
栈#中等#最小栈
前文
设计一个支持push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现MinStack
类:
1
2
3
4
5
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
示例 1:
输入:
["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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MinStack {
public:
MinStack() {
}
void push(int val) {
}
void pop() {
}
int top() {
}
int getMin() {
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
解法1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class MinStack {
private:
stack<int> x_stack;
stack<int> min_stack;
public:
MinStack() {
min_stack.push(INT_MAX);
}
void push(int x) {
x_stack.push(x);
min_stack.push(min(min_stack.top(), x));
}
void pop() {
x_stack.pop();
min_stack.pop();
}
int top() {
return x_stack.top();
}
int getMin() {
return min_stack.top();
}
};
问题主要在于以O(1)时间复杂度获取最小元素,因此需要以空间换时间, 同时建立一个当前栈长度下的最小元素栈,举例:
1
2
3
4
5
6
7
8
stack: 1
min_stack: 1
stack: 1, 2
min_stack: 1, 1
stack: 1, 2, -1
min_stack: 1, 1, -1
stack: 1, 2, -1, 10
min_stack: 1, 1, -1, -1
如上,因为原始栈pop
出栈顶元素后,需要找到剩余最小元素,所以每次压入新元素时, min_stack
压入当前长度下最小元素,原始栈pop
栈顶元素,则最小元素栈也pop
出一个栈顶元素, 因为min_stack
的各长度下的栈顶元素则为原始栈相应长度下的最小元素, 所以getMin()
只要获取第一个元素返回即可。
本文由作者按照 CC BY 4.0 进行授权