博客
关于我
【Leetcode】716. Max Stack
阅读量:226 次
发布时间:2019-02-28

本文共 1929 字,大约阅读时间需要 6 分钟。

为了实现一个支持进栈、出栈、查看栈顶、查看最大值以及删掉最大值的数据结构,我们可以使用两个栈的方法。具体来说,一个栈用于存储原始数据,另一个栈用于记录当前栈中的最大值。这种方法不仅能够高效地处理最大值的弹出操作,还能在弹出最大值时保持其他数据的正确性。

核心思路

  • 数据存储

    • 栈s1用于存储原始数据,按照FILO原则进行操作。
    • 栈s2用于存储当前栈中的最大值,保持单调递减的顺序。
  • 操作处理

    • push:将数据推入s1,同时检查并更新s2,确保s2记录当前最大值。
    • pop:从s1中弹出数据,同步处理s2中的最大值记录。
    • top:返回s1的栈顶。
    • peekMax:返回s2的栈顶,即当前最大值。
    • popMax:弹出当前最大值,并调整s1和s2中的数据,确保数据正确性。
  • 时间复杂度与空间复杂度

    • 时间复杂度:除了弹出最大值的操作外,其他操作的时间复杂度为O(1),弹出最大值的时间复杂度为O(n)。
    • 空间复杂度:使用两个栈存储数据,因此空间复杂度为O(n)。
  • 详细步骤

  • 初始化

    • 创建两个栈s1和s2。
  • push(int x)

    • 将数据推入s1。
    • 检查s2,若s2为空或s2的栈顶小于等于当前数据,则推入s2。
  • pop()

    • 弹出s1的栈顶数据x。
    • 检查s2,如果弹出的x等于s2的栈顶,则同时弹出s2的栈顶。
  • top()

    • 返回s1的栈顶。
  • peekMax()

    • 返回s2的栈顶,即当前最大值。
  • popMax()

    • 弹出s2的栈顶,记录为maxValue。
    • 创建临时栈tempStk。
    • 从s1中弹出所有小于maxValue的数据,直到s1为空或栈顶大于等于maxValue。
    • 弹出s1的栈顶。
    • 将tempStk中的数据重新推入s1,同时调用push方法,确保s2记录正确。
  • 代码实现

    import java.util.ArrayDeque;import java.util.Deque;public class MaxStack {    private Deque
    s1; private Deque
    s2; public MaxStack() { s1 = new ArrayDeque<>(); s2 = new ArrayDeque<>(); } public void push(int x) { s1.push(x); if (s2.isEmpty() || s2.peek() <= x) { s2.push(x); } } public int pop() { int x = s1.pop(); if (!s2.isEmpty() && x == s2.peek()) { s2.pop(); } return x; } public int top() { return s1.peek(); } public int peekMax() { return s2.peek(); } public int popMax() { int maxValue = s2.pop(); Deque
    tempStk = new ArrayDeque<>(); while (!s1.isEmpty() && s1.peek() < maxValue) { tempStk.push(s1.pop()); } s1.pop(); while (!tempStk.isEmpty()) { push(tempStk.pop()); } return maxValue; }}

    代码解释

    • push(int x):将数据推入s1,并根据s2的当前状态更新最大值记录。
    • pop():弹出s1的栈顶数据,并同步调整s2中的最大值记录。
    • top():返回s1的栈顶数据。
    • peekMax():返回s2的栈顶,即当前最大值。
    • popMax():弹出当前最大值,并将较小的数据重新推入s1,同时更新s2的记录,确保数据的正确性。

    这种方法通过两个栈的协同工作,确保了数据操作的高效性和正确性,充分利用了栈的先进后出特性,有效地解决了最大值弹出问题。

    转载地址:http://dsds.baihongyu.com/

    你可能感兴趣的文章
    pymysql.err.OperationalError: (1364, “Field ‘id‘ doesn‘t have a default value“)
    查看>>
    Pytorch Tensor 维度操作的形象理解 Tensor.unsqueeze() Tensor.squeeze()
    查看>>
    PyMySQL库对Mysql数据库进行增删改查与工具类封装
    查看>>
    pynput的基本介绍和使用
    查看>>
    pyodbc 通过 IIS7 连接到 MSSQL 2005 服务器
    查看>>
    PyPI 存储库中的 JarkaStealer:深入解析与防范措施
    查看>>
    Pyplot tutorial,Pyplot官方教程自翻译
    查看>>
    PyQ5学习笔记——使用内部槽函数关闭窗口
    查看>>
    PyQ5学习笔记——使用自定义槽函数关闭窗口
    查看>>
    PyQt MimeData 文件名
    查看>>
    PyQt QML Material Design 按钮背景不会改变
    查看>>
    PyQt QString转成python stirng
    查看>>
    PyQt QToolButton在焦点时不更新图标
    查看>>
    PyQt 正确使用 emit() 和 pyqtSignal()
    查看>>
    PyQT-将文件复制到剪贴板
    查看>>
    PYQT.如何在QTableView中插入小部件
    查看>>
    PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用
    查看>>
    PyQt4 到 PyQt5 ->mainFrame() 已弃用,需要修复才能加载网页
    查看>>
    PyQt4, class:mouseButtons用法
    查看>>
    PyQt4参考文档
    查看>>