力扣面试150(44/150)

7.30 155. 最小栈

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

我的思路:

最开始我其实想得蛮简单的,直接维护一个min就可以了,但是我发现其实这个min是不断变化的,因为pop的原因,min很有可能会被pop掉,所以我又想到直接动态维护一个minStack,里面是升序的序列,但是我还是想得太简单了,我发现你也有可能pop出minStack里面的值,太伤脑筋了吧。但是我发现每次geMin和stack里面的最后一个数字总是有关系的,干脆维护一个当前数值的最小栈,stack实现pop操作,minStack也对应实现pop操作就可以啦

复制代码
// 返回一个数组模拟栈
var MinStack = function() {
    this.stack = [];
    this.minStack = [];
    return null;
};

/** 
 * @param {number} val
 * @return {void}
 */
MinStack.prototype.push = function(val) {
    let minLen = this.minStack.length;
    if(minLen === 0){
        this.minStack.push(val);
    }else {
    let min = this.minStack[this.minStack.length - 1];
    min > val ?  this.minStack.push(val) :  this.minStack.push(min);
    }
    // 把最小的放在数组当中的最后一个
    this.stack.push(val);
    return null;
    
    
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    this.stack.pop();
    this.minStack.pop();
    console.log("pop" + this.minStack);
    return null;
    
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    let len = this.stack.length;
    return this.stack[len - 1];
    
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function() {
    let len = this.minStack.length;
    return this.minStack[len - 1];
    
};

/** 
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(val)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.getMin()
 */
//  本来想要新建一个min:最小值,但是因为有pop,很有可能会把最小的也pop掉
//  那么这个时候最小值就是动态变化的了
// minStack里面只存储升序的数值是不行的,也是因为pop的问题
// minStack里面存储的是每一个数的情况下的的最小值

总结:这段代码实现了一个最小栈(MinStack),能够在常数时间内获取栈中的最小元素。核心思路是使用两个栈:一个主栈stack存储所有元素,另一个辅助栈minStack存储每个状态下的最小值。

push操作时,会同时向两个栈添加元素。对于minStack,如果它是空的或者新元素比当前最小值更小,就添加新元素;否则就添加当前最小值。这样minStack的栈顶始终是当前栈的最小值。

pop操作会同时从两个栈移除栈顶元素,保持同步。

top方法直接返回主栈的栈顶元素。

getMin方法返回辅助栈的栈顶元素,也就是当前栈的最小值。

这种设计确保了所有操作(push、pop、top、getMin)都能在O(1)时间内完成,空间复杂度为O(n),最坏情况下需要额外存储n个元素。

相关推荐
熬了夜的程序员39 分钟前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
学习笔记1011 小时前
第十五章认识Ajax(六)
前端·javascript·ajax
dragoooon343 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
theOtherSky4 小时前
element+vue3 table上下左右键切换input和select
javascript·vue.js·elementui·1024程序员节
会联营的陆逊4 小时前
JavaScript 如何优雅的实现一个时间处理插件
javascript
over6974 小时前
浏览器里的AI魔法:用JavaScript玩转自然语言处理
前端·javascript
Amy_cx4 小时前
搭建React Native开发环境
javascript·react native·react.js
代码AI弗森4 小时前
Python × NumPy」 vs 「JavaScript × TensorFlow.js」生态全景图
javascript·python·numpy
疏狂难除5 小时前
关于spiderdemo第二题的奇思妙想
javascript·爬虫