IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode-剑指 Offer 30. 包含min函数的栈 -> 正文阅读

[数据结构与算法]LeetCode-剑指 Offer 30. 包含min函数的栈

LeetCode-剑指 Offer 30. 包含min函数的栈

在这里插入图片描述

原文链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof

1. 问题描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();   --> 返回 0.
minStack.min();   --> 返回 -2.

提示:
各函数的调用总次数不超过 20000 次

2. 解析

通过上面的描述我觉得直接用O(1)能解决问题吗?
不得判断所有栈里面的数据从小到大排列一下。
后来看了题解才发现我理解错误了。
题目的要求就是压进去的数据顺序不变,
只是每次栈里面的最小数是有顺序的。
这里面不需要使用两个栈,
有一个最小值变量维护,
每次压进去保存最小值,
然后也把最小值压进去,
就是每次压进去两个值:最小值和当前值。
然后弹出的时候需要弹出两个值:当前值和最小值。
注意:压入最小值和当前值的顺序不能变!

在这里插入图片描述

3. 考答案

class MinStack {

    private Stack<Integer> stack;
    private Integer min = Integer.MAX_VALUE;
    /** 初始化*/
    public MinStack() {
        stack = new Stack<>();
    }

    /**
     * 压入栈
     */
    public void push(int x) {
        // 上来先把最小值压进去,保证最顶端的值是最小值
        stack.push(min);
        // 判断新值是否是最小的
        if (x < min) {
            min = x;
        }
        // 然后把新值压进去
        stack.push(x);
    }

    /**
     * 正常弹出即可
     */
    public void pop() {
        // 注意要把新值弹出去
        stack.pop();
        // 接下来得到的是最小值
        min = stack.peek();
        // 因为之前我们先把最小值压进去,所以要弹出两次
        stack.pop();
    }

    /**
     * 获取栈顶的数据
     */
    public int top() {
        return stack.peek();
    }

    /**
     * 获取最小值
     */
    public int min() {
        return min;
    }

    public static void main(String[] args) {
        // 输入指令那一行数据如:["MinStack","push","push","push","min","pop","top","min"]
        Scanner scanner = new Scanner(System.in);
        String inputStr = scanner.next();
        // 去头去尾,替换“并处理成: MinStack,push,push,push,min,pop,top,min
        inputStr = inputStr.substring(1, inputStr.length() - 1).replaceAll("\"", "");
        String[] commends = inputStr.split(",");

        // 输入代码对应的值:[[],[-2],[0],[-3],[],[],[],[]]
        String valueStr = scanner.next();
        // 去头去尾即可:[],[-2],[0],[-3],[],[],[],[]
        valueStr = valueStr.substring(1, valueStr.length() - 1);
        String[] values = valueStr.split(",");

        MinStack minStack = null;

        // 存放最终的结果
        StringBuilder result = new StringBuilder();
        result.append("[");

        for (int i = 0; i < commends.length; i++) {
            String commend = commends[i];
            String value = values[i];
            // 对应处理指令
            switch (commend) {
                // 初始化
                case "MinStack":
                    minStack = new MinStack();
                    result.append("null,");
                    break;
                // 入栈
                case "push":
                    // 去头去尾,拿到中括号里面数字
                    String num = value.substring(1, value.length() - 1);
                    minStack.push(Integer.parseInt(num));
                    result.append("null,");
                    break;
                // 获取最小值
                case "min":
                    int min = minStack.min();
                    result.append(min+",");
                    break;
                // 出栈
                case "pop":
                    minStack.pop();
                    result.append("null,");
                    break;
                // 栈顶数据
                case "top":
                    int top = minStack.top();
                    result.append(top+",");
                    break;
                default:
            }
        }
        // 去除最后一个逗号,
        String resultStr = result.substring(0, result.length() - 1);
        System.out.println(resultStr+"]");
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:33:00  更:2021-12-15 18:33:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:25:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码