力扣面试150(44/150)

7.30 155. 最小栈

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

实现 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个元素。

相关推荐
远离UE413 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience13 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
hanlin0313 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
All for pursuit.14 小时前
【动态规划-21】312.戳气球
数据结构·c++·算法·leetcode·动态规划
子林super17 小时前
MySQL三大日志(binlog、redo log和undo log)详解
面试
Scintilla_y17 小时前
DAY2 滑动窗口
算法·leetcode·散列表
SensorFlow17 小时前
曝光埋点别放在组件渲染里:连续可见与去重范围怎么验收
javascript
harris148154352975817 小时前
能解码不等于能信任:JWT 的签名到底验的是什么
javascript
liqingdi43717 小时前
[SWPUCTF 2023 秋季新生赛]Easy SMC
服务器·前端·javascript