携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack()初始化堆栈对象。void push(int val)将元素val推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。int getMin()获取堆栈中的最小元素。
链接: 155. 最小栈
分析
根据题意可知
- 在JavaScript中,堆栈数据存储形式是数组
- push和pop直接使用数组相关的方法即可实现
- top获取栈的最后一个元素
- 要想在常数时间内检索到最小值,所以最小栈中要有变量来维护这个最小值,这里的常数时间我们可以进一步优化成O(1)
- 最小值可能会在pop、push的时候发生变化,需要在两个过程中维护正常状态的变化
如果时间复杂度为O(1),要怎么维护最小值
想法一:使用一个数组来维护一个降序数组,getMin的时候,返回数组的最后一项
代码
class MinStack {
constructor() {
this.stack=[];
this.minStack=[];
}
push (val) {
if(this.minStack.length){ this.minStack.push(Math.min(val,this.minStack[this.minStack.length-1])); }
else{ this.minStack.push(val); }
this.stack.push(val);
}
pop () {
if(this.stack.length){ this.stack.pop(); this.minStack.pop(); }
}
top () {
return this.stack.length ?this.stack[this.stack.length-1] :null
}
getMin () {
return this.minStack.length ?this.minStack[this.minStack.length-1] :null
}
};
想法二:使用一个变量值来记录最小值,getMin的时候返回这个值
代码
var MinStack = function() {
this.stack=new Array();
this.min=Infinity;
};
MinStack.prototype.push = function(val) {
this.min=Math.min(this.min, val);
this.stack.push([val, this.min]);
};
MinStack.prototype.pop = function() {
this.stack.pop();
this.min=this.stack.length>0? this.getMin(): Infinity;
};
MinStack.prototype.top = function() {
return this.stack[this.stack.length-1][0];
};
MinStack.prototype.getMin = function() {
return this.stack[this.stack.length-1][1];
};
总结
- JavaScript原生数组的方法很多,有的符合栈有的符合队列,需要熟练掌握这些原生方法
- 可以看到这道题中关于新数据类型是通过function来构建的,在原型链上挂方法,在class出现前,就是用function来实现新数据结构
- 今天也是有收获的一天