• hot100- 最小栈


    最小栈

    题目描述:

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

    实现 MinStack 类:

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

    思路:

    实现入栈出栈操作,以及获取最小数的操作利用list都能很方便的实现,最新元素加入在list末尾,每次pop时就remove l ist末尾的那个元素,获取最小数则让list第一个元素始终存储list中最小值,那就需要在每次push和pop操作时判断这个min是否需要更新。

    题解中很棒的思路:

    利用一个栈,同时维持最小值,最小值的更新要么是push进了一个新的min,要么是pop掉了最小值。如果最小值被pop,我们需要让原来的次小值成为新的最小值,那就可以每次如果要push进新的min,我们就push原来的min(次小值),与新的min,在pop操作时,如果我们pop的元素等于min,那就pop出两个值,这个pop出来的的第二个数就等于次小值,然后我们更新min为这个此小值。

    代码:

    class MinStack {
    
        List<Integer> list ;
    
        public MinStack() {
            list = new ArrayList<>();
            list.add(0);
        }
    
        public void push(int val) {
            list.add(val);
            if(val< list.get(0)){
                list.set(0 ,val);
            }
        }
    
        public void pop() {
            list.remove(list.size()-1);
            for (int i = 0; i < list.size(); i++) {
                if (list.get(0)>list.get(i)) {
                    list.set(0,list.get(i));
                }
            }
        }
    
        public int top() {
            return list.get(list.size()-1);
        }
    
        public int getMin() {
            return list.get(0);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    题解中思路的代码:

    class MinStack {
        
        private int min = Integer.MAX_VALUE;
        private Stack<Integer> stack;
        /** initialize your data structure here. */
        public MinStack() {
            stack = new Stack<>();
        }
    
        public void push(int x) {
            if(min >= x){
                stack.push(min);
                min = x;
            }
            stack.push(x);
        }
    
        public void pop() {
            if(stack.pop() == min){
                min = stack.pop();
            }
        }
    
        public int top() {
          return stack.peek();
        }
    
        public int getMin() {
            return min;
        }}
    
    /**
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    OpUtils局域网唤醒:远程引导计算机
    【Linux】 grep命令使用
    linux 配置C/C++代码静态分析工具cppcheck+git
    文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题
    2022-06-26 笔记本新机重装系统
    Electron 从基础到实战笔记 - Electron App对象及其事件
    【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
    K8S之Secret的介绍和使用
    基于IDEA的Maven(依赖介绍和引用)
    通过rebase,解决gitlab提示的pipeline failed
  • 原文地址:https://blog.csdn.net/wxy1516492904/article/details/126096667