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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 最小栈_辅助栈存储最小元素 -> 正文阅读

[数据结构与算法]最小栈_辅助栈存储最小元素

155. 最小栈

力扣icon-default.png?t=L892https://leetcode-cn.com/problems/min-stack/

难度简单1041

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

  • push(x)?—— 将元素 x 推入栈中。
  • pop()?—— 删除栈顶的元素。
  • top()?—— 获取栈顶元素。
  • getMin()?—— 检索栈中的最小元素。

示例:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • poptop?和?getMin?操作总是在?非空栈?上调用。

通过次数287,899提交次数502,228

题目描述:

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

  • push(x),——将元素x压入栈中;
  • pop(),——删除栈顶元素;
  • top(),——获取栈顶元素;
  • getMin(),——获取栈中的最小元素。

示例:

解释:

先创建一个栈——minStack;

然后push进栈一个元素-2,

然后push进栈一个元素0,

然后push进栈一个元素-3,

然后获取栈中的最小元素——返回-3,

然后进行pop出栈栈顶元素-3,

然后top获取栈顶元素——返回0,

然后获取栈中的最小元素——返回-2。

使用现有的栈数据结构可以完成pop、push、top(对应的是peek操作),但是无法在常数时间内完成getMin()操作,我们的办法是使用一个辅助栈来辅助完成操作。

如下图所示:

?举例:

  1. 首先创建一个数据栈,和一个辅助栈。
  2. 然后push进栈一个元素-2,因为当前数据栈和辅助栈都是空的,所以直接push进去。
  3. 然后push进栈一个元素0,因为0>-2,所以辅助栈的栈顶元素仍然是-2;
  4. 然后push进栈一个元素-3,因为-3小于当前栈顶元素-2,所以-3成为新的栈顶元素;
  5. 然后执行getMin操作,获取当前最小元素,也就是当前辅助栈的栈顶元素——-3;
  6. 然后执行pop出栈操作,因为辅助栈的栈顶元素和数据栈要出栈的元素一样,所以数据栈和辅助栈都执行出栈操作;
  7. 然后执行top操作,返回当前数据栈的栈顶元素,即0;
  8. 然后执行getMin操作,返回当前辅助栈的栈顶元素,即-2。

代码:

package zyh.springcloud.chapter2.service.impl.datastructure.stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @ClassName minStack
 * @Author zhangyonghui
 * @Description:最小栈
 * @Date 2021/10/2 16:59
 * @Version 1.0
 **/
public class MinStack {
        private Deque<Integer> dataStack;
        private Deque<Integer> fuzhuStack;

        /**
         * 思想:使用一个辅助栈进行操作:(始终将数据栈栈中最小的元素存入辅助栈的栈顶)
         * 1,当进行入栈的时候,将进行入栈的元素与辅助栈中的栈顶元素进行比较,如果小于当前辅助栈中的栈顶元素,则将该最小值也压入辅助栈中,成为新的栈顶元素;
         * 2,当进行出栈的时候,如果出的元素同时也是辅助栈的栈顶元素,那么连同辅助栈进行一起出栈;
         * 3,当获取栈中的最小元素的时候,则获取辅助栈的栈顶元素。
         */

        /**
         * 构造方法:初始化一个数据栈、一个辅助栈;
         */
        public MinStack() {
                dataStack = new LinkedList<>();
                fuzhuStack = new LinkedList<>();
        }

        /**
         * 入栈操作:进行入栈操作的时候,比较即将入栈的元素与辅助栈中的栈顶元素,如果小于,则将该入栈的元素同时也压入到辅助栈中,成为新的栈顶元素;
         * @param val
         */
        public void push(int val) {
                //如果辅助栈是空的,则不需要进行比较,直接入栈:
                if (fuzhuStack.isEmpty()) {
                        dataStack.push(val);
                        fuzhuStack.push(val);
                }
                //如果辅助栈是非空的,则进行比较:
                else{
                        //取出辅助栈中的现在的栈顶元素:
                        Integer nowStackDing = fuzhuStack.peek();
                        //进行比较:
                        if (nowStackDing >= val) {
                                //将该val压入辅助栈,成为新的栈顶元素;
                                fuzhuStack.push(val);
                        }
                        //压入数据栈:
                        dataStack.push(val);
                }
        }

        public void pop() {
                //出栈操作:如果该数据栈的栈顶元素同时也是辅助栈的栈顶元素,则同时进行出栈,否则只进行数据栈的出栈操作;
                if (dataStack.peek().equals(fuzhuStack.peek())) {
                        dataStack.pop();
                        fuzhuStack.pop();
                }else {
                        dataStack.pop();
                }
        }

        public int top() {
                //获取栈顶元素:
                if (!dataStack.isEmpty()) {
                        return dataStack.peek();
                }else{
                        return -1;
                }
        }

        //获取最小值:
        public int getMin() {
                if (!fuzhuStack.isEmpty()) {
                        return fuzhuStack.peek();
                }else {
                        return -1;
                }
        }

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:18:25  更:2021-10-03 17:19:57 
 
开发: 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年5日历 -2024/5/17 14:38:35-

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