力扣面试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个元素。

相关推荐
午安~婉20 分钟前
Electron桌面应用聊天(续)
前端·javascript·electron
哈里谢顿41 分钟前
如何实现分布式锁
面试
skywalker_111 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg1 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
哟哟耶耶1 小时前
vue3-单文件组件css功能(:deep,:slotted,:global,useCssModule,v-bind)
前端·javascript·css
是罐装可乐1 小时前
深入理解“句柄(Handle)“:从浏览器安全到文件系统访问
前端·javascript·安全
_日拱一卒1 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
华科易迅2 小时前
Vue如何集成封装Axios
前端·javascript·vue.js
不是az2 小时前
CSS知识点记录
前端·javascript·css