LeetCode[中等] 155. 最小栈

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

实现 MinStack 类:

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

思路:

若栈中元素为 b c d,a进栈,则只要a在栈中,b c d 就一定在栈中(a出栈之前,b c d 一定不会出栈),因此,a为栈顶一定对应一个最小元素

利用辅助栈,将元素栈同步插入与删除,用于存储与每个元素对应的最小值:

  • 栈顶存储栈内最小元素
  • 新元素入栈时,将当前辅助栈的栈顶存储的最小值 与 当前元素进行比较,从而更新栈顶最小值
cs 复制代码
public class MinStack {
    Stack<int> stack;
    Stack<int> minStack;
    public MinStack() {
        stack = new Stack<int>();
        minStack = new Stack<int>();
    }
    
    public void Push(int val) {
        stack.Push(val);
        if (minStack.Count > 0 && val > minStack.Peek()) {
            minStack.Push(minStack.Peek());
        }
        else
            minStack.Push(val);
        
    }
    
    public void Pop() {
        stack.Pop();
        minStack.Pop();
    }
    
    public int Top() {
        return stack.Peek();
    }
    
    public int GetMin() {
        return minStack.Peek();
    }
}

复杂度分析

  • 时间复杂度:构造方法和每一项操作的时间复杂度都是 O(1)。
  • 空间复杂度:O(n),其中 n 是元素个数。空间复杂度主要取决于栈空间,常规栈和最小元素栈的空间都是 O(n)。
相关推荐
企业数字化笔记2 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!3 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6585 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧5 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm5 小时前
40 二叉树的直径
c++·leetcode
Shimeri6 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J6 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang6 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖6 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy6 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化