链接:剑指offer30
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路:
普通栈的 push() 和 pop() 函数的复杂度为 O(1) ;而获取栈最小值 min() 函数需要遍历整个栈,复杂度为 O(N)。
本题难点: 将 min() 函数复杂度降为 O(1),可通过建立辅助栈实现:
数据栈 stack : 栈 A用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
辅助栈 minStack: 栈中存储栈 stack 中所有 非严格降序 的元素,则栈 stack 中的最小元素始终对应栈 minStack的栈顶元素,即 min() 函数只需返回栈 minStack的栈顶元素即可。
函数设计:
- push(x) 函数: 重点为保持栈 minStack的元素是 非严格降序 的。
将 x压入栈 A
若 ① 栈 minStack为空 或 ② x 小于等于 栈 minStack的栈顶元素,则将 x 压入栈 minStack。 - pop() 函数: 重点为保持栈 stack,minStack 的 元素一致性 。
执行栈 stack出栈,将出栈元素记为 x;
若 x等于栈 minStack的栈顶元素,则执行栈 minStack出栈。 - top() 函数: 直接返回栈 stack的栈顶元素即可。
- min() 函数: 直接返回栈 minStack的栈顶元素即可。
代码实现:
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.stack=[];
this.minStack=[];
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
let {stack,minStack}=this;
stack.push(x);
const length=minStack.length;
if(!length || x <= minStack[length-1]){
minStack.push(x);
}
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
let {stack,minStack}=this;
if(stack.length){
let x=stack.pop();
if(x==minStack[minStack.length-1]){
minStack.pop();
}
}else{
return null;
}
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
const length=this.stack.length;
if(length){
return this.stack[length-1];
}else{
return null;
}
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
const length=this.minStack.length;
if(length){
return this.minStack[length-1];
}else{
return null;
}
};
/**
* 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()
*/