剑指 Offer 30. 包含min函数的栈

258 阅读1分钟

剑指 Offer 30. 包含min函数的栈

题意

剑指 Offer 30. 包含min函数的栈

image.png

解法

这一题主要就是考虑怎么维护最小元素的位置

进栈的时候情况比较简单,若发生交换一定是进栈的元素

出栈的时候情况比较复杂,因为如果出栈的元素是最小的元素,则需要找出第二小的元素更新最小元素的位置。这里采用了遍历剩余元素的方法找出最小的元素。

优化:在出栈的时候比较出栈元素和最小元素。 若出栈元素>最小元素,则最小元素位置不变,跳过遍历过程。 若出栈元素=最小元素,则需要进行遍历获取剩余元素中的最小元素。

代码

/**
 * initialize your data structure here.
 */
 var MinStack = function() {
    this.arr = []                   // 用数组模拟栈
    this.stackTop =  0              // 记录栈顶的位置
    this.minIndex = 0               // 记录最小元素的位置
};

/** 
 * @param {number} x
 * @return {void}
 */
MinStack.prototype.push = function(x) {
    this.arr[this.stackTop++] = x
    
    // 在元素进栈的时候更新最小元素的位置
    if(x<this.arr[this.minIndex])this.minIndex = this.stackTop-1
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    if (this.stackTop > 0) {
    this.stackTop--;
    
    // 在元素出栈的时候更新最小元素的位置
    if (this.stackTop === 0) {
      this.minIndex = 0;
    } else {
    
    // 若栈不为空,遍历获取最小元素的位置
      let tep = 0;
      for (let i = 0; i < this.stackTop; i++) {
        if (this.arr[i] < this.arr[tep]) {
          tep = i
          
        }
      }
      this.minIndex = tep
    }
  }
  return null;
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    return this.arr[this.stackTop-1]

};

/**
 * @return {number}
 */
MinStack.prototype.min = function() {
    return this.stackTop===0?undefined:this.arr[this.minIndex]

};

/**
 * 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()
 */