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

相关推荐
sunbyte11 分钟前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | 3dBackgroundBoxes(3D背景盒子组件)
前端·javascript·vue.js·3d·vue
明长歌14 分钟前
【javascript】new.target 学习笔记
javascript·笔记·学习
Dream it possible!1 小时前
LeetCode 面试经典 150_数组/字符串_买卖股票的最佳时机(7_121_C++_简单)(贪心)
c++·leetcode·面试·贪心算法
Fantastic_sj2 小时前
CSS-in-JS 动态主题切换与首屏渲染优化
前端·javascript·css
崎岖Qiu3 小时前
【JVM篇11】:分代回收与GC回收范围的分类详解
java·jvm·后端·面试
再学一点就睡6 小时前
手写 Promise 静态方法:从原理到实现
前端·javascript·面试
再学一点就睡6 小时前
前端必会:Promise 全解析,从原理到实战
前端·javascript·面试
OEC小胖胖8 小时前
性能优化(一):时间分片(Time Slicing):让你的应用在高负载下“永不卡顿”的秘密
前端·javascript·性能优化·web
茴香豆的茴8 小时前
转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串(python)
leetcode
小小李程序员8 小时前
JSON.parse解析大整数踩坑
开发语言·javascript·json