-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
问题
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
定义两个栈,一个存储数据,另一个用于存储每次数据进栈时栈的最小值,每次数据进栈时,将当前数据与最小值栈栈顶元素比较,将两者中较小的值再次存入最小值栈中,当数据栈出栈的时候,最小值栈也出栈,这样最小值的栈顶永远是当前栈(数据栈)的最小值。
[[push],[push],[push],[push],[push],[push]]
[[4],[5],[3],[8],[7],[0]]
以上面面操作为例,则数据栈和其对应的最小值栈如下
| 数据栈 | 最小值栈 |
|---|---|
| 0 | 0 |
| 7 | 3 |
| 8 | 3 |
| 3 | 3 |
| 5 | 4 |
| 4 | 4 |
代码
class MinStack {
constructor() {
this.dataStack = []
this.minValueStack = []
}
/**
* @param {number} x
* @return {void}
*/
push(x) {
this.dataStack.push(x)
// 这样minValueStack栈顶一直是最小
const min = this.min()
if (this.minValueStack.length === 0 || x < min) {
this.minValueStack.push(x)
} else {
this.minValueStack.push(min)
}
}
/**
* @return {void}
*/
pop() {
this.minValueStack.pop()
return this.dataStack.pop()
}
/**
* @return {number}
*/
top() {
return this.dataStack[this.dataStack.length - 1]
}
/**
* @return {number}
*/
min() {
const length = this.minValueStack && this.minValueStack.length
return length && this.minValueStack[length - 1]
}
}
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.min()
*/