最小栈-简单
难度:简单
题目描述:
设计一个支持 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
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
解题思路:
需要额外维护一个栈 min_stack,存栈中曾经的最小值
当第 1 个元素入栈时,让它也入 min_stack 栈
之后,新元素入栈时,让它和 min_stack 栈的栈顶元素比较大小,如果小于,则让它进 min_stack 栈,min_stack 的栈顶就是当前栈中的最小值
每当有元素出栈时,如果出栈的是栈中最小元素,则让 min_stack 的栈顶元素也出栈,此时原本第 2 小的元素顶替了出栈的元素,成为当前的最小值
getMin 就返回 min_stack 的栈顶元素,即栈中的最小值
var MinStack = function () {
this.stack = [];
this.min_stack = [];
};
MinStack.prototype.push = function (x) {
this.stack.push(x);
if (
x <= this.min_stack[this.min_stack.length - 1] ||
this.min_stack.length === 0
) {
this.min_stack.push(x);
}
};
MinStack.prototype.pop = function () {
let out = this.stack.pop();
if (this.min_stack[this.min_stack.length - 1] === out) {
this.min_stack.pop();
}
};
MinStack.prototype.top = function () {
return this.stack[this.stack.length - 1];
};
MinStack.prototype.getMin = function () {
return this.min_stack[this.min_stack.length - 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
28
29
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