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

相关推荐
小欣加油1 小时前
leetcode 904 水果成篮
c++·算法·leetcode
君万2 小时前
【LeetCode每日一题】56. 合并区间
算法·leetcode·golang
墩墩同学2 小时前
【LeetCode题解】LeetCode 287. 寻找重复数
算法·leetcode·二分查找
Elieal2 小时前
Java 链表完全指南:从基础到力扣简单题实战
java·leetcode·链表
小南家的青蛙2 小时前
LeetCode第55题 - 跳跃游戏
算法·leetcode·职场和发展
芜青3 小时前
JavaScript手录18-ajax:异步请求与项目上线部署
开发语言·javascript·ajax
织_网3 小时前
Electron 核心 API 全解析:从基础到实战场景
前端·javascript·electron
围巾哥萧尘3 小时前
「电脑的故事」从电脑的故事谈用人的策略🧣
面试
学历真的很重要4 小时前
Eino 开源框架全景解析 - 以“大模型应用的搭积木指南”方式理解(一)
后端·语言模型·面试·golang·ai编程·eino
2401_837088504 小时前
setup 语法糖核心要点
开发语言·前端·javascript