LC.155. Min Stack(优化,针对整块一样数传入)
发布日期:2025-04-04 10:31:12 浏览次数:12 分类:精选文章

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

重新优化后的文章:

今天,我尝试解决了一个关于栈操作的问题,具体是要实现一个支持“栈最小值”的数据结构。通过仔细分析和实验,我逐步理清了思路,最终找到了一个可行的解决方案。这个问题非常有趣,因为它结合了解决栈问题的常规方法和对最小值出现次数的记录需求,使得解决方案需要额外的思考和设计。

思考过程

  • 问题理解

    • 我需要设计一个数据结构,支持推入和弹出操作。每次推入一个数,要求在弹出时能够快速知道当前最小值,并确保最小值的记录准确。
  • 初步思路

    • 使用主栈存储所有元素,辅助栈记录最小值及其出现次数,计数栈记录当前最小值出现的次数。
    • 每次推入一个数,检查是否需要更新最小值。如果是,清空之前的记录并重置次数;如果不是,记录当前次数。
    • 每次弹出时,需要判断是否弹出最小值,并根据出现次数决定是否需要从辅助栈弹出记录。
  • 细节处理

    • 推入(push)
      • 如果辅助栈为空,记录当前数作为最小值并计数。
      • 如果当前数小于辅助栈顶部的最小值,弹出旧的记录,增加当前数的计数。
      • 如果当前数等于或大于辅助栈顶部的最小值,直接记录。
    • 弹出(pop)
      • 弹出主栈的顶部数。
      • 检查是否需要弹出辅助栈的最小值,并根据计数记录进行调整。
  • 测试案例

    • 测试多个重复数值的推入和弹出,确保最小值记录正确。
    • 测试不同数值交替推入和弹出的情况,验证逻辑正确性。
  • 解决方案

    通过上述思考,我设计了以下数据结构和算法:

    public class LC_155_MinStack_II {    private Deque
    stack = new LinkedList<>(); private Deque повітря nutritri hoặc 更详细的代码需要根据具体实现。 // 初始化数据结构 public LC_155_MinStack_II() { stack = new LinkedList<>(); auxiliaryStack = new LinkedList<>(); counter = new LinkedList<>(); } // 压栈操作 public void push(int x) { stack.push(x); if (auxiliaryStack.isEmpty()) { auxiliaryStack.push(x); counter.push(1); } else { int topValue = auxiliaryStack.peek(); if (x < topValue) { // 弹出旧的最小值并清空计数 counter.pop(); auxiliaryStack.pop(); // 记录新值并初始计数 counter.push(1); auxiliaryStack.push(x); } else { // 记录当前新的值及其计数 auxiliaryStack.push(x); counter.push(1); } } } // 弹栈操作 public void pop() { if (!stack.isEmpty()) { int topValue = stack.peek(); stack.pop(); if (auxiliaryStack.isEmpty()) return; // 检查是否需要弹出最小值 int min = auxiliaryStack.peek(); if (topValue == min) { int count = counter.peek(); if (count > 1) { // 还有更多这个最小值,不需要弹出辅助栈 counter.pop(); } else { // 最后一个最小值弹出 auxiliaryStack.pop(); counter.pop(); } } } } // 查看栈顶 public int top() { return stack.peek(); } // 查看最小值 public int getMin() { return auxiliaryStack.peek(); }}

    优化说明

  • 数据结构选择

    • 使用双端队列(Deque)来模拟栈,支持高效的 push 和 pop 操作。
    • auxiliaryStack 记录当前最小值及其出现次数。
    • counter 记录当前最小值的出现次数,用于辅助处理弹出操作。
  • 操作逻辑

    • push 时,根据当前数是否比辅助栈的最小值小,来决定是否更新最小值记录。
    • pop 时,判断是否需要弹出最小值,并根据记录的次数进行处理,确保在多次出现同一最小值时能正确调整记录。
  • 测试保证

    • 通过多个测试案例验证数据结构能够正确处理不同情况下的 push 和 pop 操作,确保最小值记录的准确性和正确性。
  • 结论

    通过这些步骤,我成功设计并实现了一个支持“栈最小值”的数据结构。这一解决方案通过合理的数据结构选择和操作逻辑设计,确保了在高效的时间复杂度内正确处理栈操作,满足了题目的要求。这不仅锻炼了我的数据结构分析能力,也让我对遇到类似问题有更深的理解和解决能力。

    上一篇:lc.exe 已退出 代码为 1
    下一篇:LAZYPARIAH:一键生成反向Shell负载的利器

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月12日 19时27分22秒