一起刷LeetCode——最小栈(栈)

64 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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来实现新数据结构
  • 今天也是有收获的一天