• 《算法通关村—最大小栈问题解析》


    《算法通关村—最大小栈问题解析》

    最小栈

    描述

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

    实现最小栈

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

    怎么才能在常数时间内拿到最小元素,我们通过设计两个栈,一个栈存储元素,一个栈存储最小元素(这个存储的是当前元素加入进来的时候,整个栈中最小的元素,比如说)

    # 储存元素的栈为stack,最小元素的栈为minStack 
    push(5);
    stack -> [5];
    minStack -> [5];
    push(6) ;
    stack -> [5,6];
    minStack -> [5,5]; # 这里如果插入的时候就跟当前最小栈中的元素比较,如果更小就插入,如果没有更小就插入原来最小的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过有这样两个栈,对原来元素的栈进行操作的时候,同时对最小栈进行操作,这样就能保证在常数时间内获得栈内最小元素了。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    实现代码

    package AlgorithmForth;
    
    import java.util.Deque;
    import java.util.LinkedList;
    
    /**
     * 最小栈
     */
    public class MinStack {
        Deque<Integer> xStack;
        Deque<Integer> minStack;
    
        public MinStack() {
            xStack = new LinkedList<>();
            minStack = new LinkedList<>();
            minStack.push(Integer.MAX_VALUE);
        }
    
        public void push(int x) {
            xStack.push(x);
            minStack.push(Math.min(minStack.peek(), x));
        }
    
        public void pop() {
            xStack.pop();
            minStack.pop();
        }
    
        public int top() {
            return xStack.peek();
        }
    
        public int getMin() {
            return minStack.peek();
        }
    
        public static void main(String[] args) {
            MinStack minStack1  = new MinStack();
            minStack1.push(1);
            minStack1.push(8);
            minStack1.push(2);
            minStack1.push(12);
            minStack1.push(8);
            System.out.println(minStack1.getMin());
        }
    }
    
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    最大栈

    LeetCode 716.设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素

    实现MaxStack

    MaxStack() 初始化栈对象 
    void push(int x) 将元素 x 压入栈中。 
    int pop() 移除栈顶元素并返回这个元素。 
    int top() 返回栈顶元素,无需移除。 
    int peekMax() 检索并返回栈中最大元素,无需移除。 
    int popMax() 检索并返回栈中最大元素,并将其移除。 如果有多个最大元素,只要移除 最靠近栈顶 的那个。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最大栈的实现其实和最小栈是差不多的,都是通过两个栈来实现常数查找到最大。

    直接上代码

    package AlgorithmForth;
    
    import java.util.Stack;
    
    /**
     * 最大栈
     */
    public class MaxStack {
        Stack<Integer> stack;
        Stack<Integer> maxStack;
    
        public MaxStack() {
            stack = new Stack<>();
            maxStack = new Stack<>();
        }
    
        public void push(int x) {
            int max = maxStack.isEmpty() ? x : maxStack.peek();
            maxStack.push(max > x ? max : x);
            stack.push(x);
        }
    
        public int pop() {
            maxStack.pop();
            return stack.pop();
        }
    
        public int top() {
            return stack.peek();
        }
    
        public int peekMax() {
            return maxStack.peek();
        }
    
        public int popMax() {
            int max = peekMax();
            Stack<Integer> buffer = new Stack<>();
            while (top() != max) buffer.push(pop());
            pop();
            while (!buffer.isEmpty()) push(buffer.pop());
            return max;
        }
    
        public static void main(String[] args) {
            MaxStack maxStack1 = new MaxStack();
            maxStack1.push(1);
            maxStack1.push(8);
            maxStack1.push(2);
            maxStack1.push(12);
            maxStack1.push(8);
            System.out.println(maxStack1.peekMax());
        }
    }
    
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

    在这里插入图片描述

    也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

    也可以加我QQ(2837468248)咨询说明来意!

  • 相关阅读:
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[17]以太坊-GHOST协议
    基于MFC——C++课程设计《学生信息管理系统》
    C++信息学奥赛1184:明明的随机数
    Linux基础——运维 (operation)
    halcon自定义函数基本操作
    9.19号作业
    数据库系统原理与应用教程(071)—— MySQL 练习题:操作题 110-120(十五):综合练习
    Nacos配置管理-微服务配置拉取
    大数据Flink(八十三):SQL语法的DML:With、SELECT & WHERE、SELECT DISTINCT 子句
    UML类图
  • 原文地址:https://blog.csdn.net/Go_ahead_forever/article/details/134091242