LeetCode[中等] 155. 最小栈

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

实现 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)。
相关推荐
We་ct1 分钟前
LeetCode 25. K个一组翻转链表:两种解法详解+避坑指南
前端·算法·leetcode·链表·typescript
Hag_204 分钟前
LeetCode Hot100 438.找到字符串中的所有字母异位词
算法·leetcode·职场和发展
元亓亓亓5 分钟前
LeetCode热题100--239. 滑动窗口最大值--困难
数据结构·算法·leetcode
闻缺陷则喜何志丹12 分钟前
【进制】P2320 [HNOI2006] 鬼谷子的钱袋|普及+
c++·算法·进制
田里的水稻14 分钟前
FA_融合和滤波(FF)-图优化
人工智能·算法·机器学习
月挽清风20 分钟前
代码随想录第32天:动态规划
算法·动态规划
不想看见40424 分钟前
Word Search -- 回溯法--力扣101算法题解笔记
笔记·算法·leetcode
2501_9011478326 分钟前
硬币找零问题的动态规划解法与实现思考笔记
笔记·算法·动态规划
Renhao-Wan29 分钟前
Java 算法实践(三):双指针与滑动窗口
java·数据结构·算法
Pluchon29 分钟前
硅基计划4.0 算法 图的存储&图的深度广度搜索&最小生成树&单源多源最短路径
java·算法·贪心算法·深度优先·动态规划·广度优先·图搜索算法