[算法最优]设计一个有getMin功能的栈

程序员代码面试指南:IT名企算法与数据结构题目最优解(题目) 第1章 栈和队列  设计一个有getMin功能的栈(士 ★☆☆☆)  由两个栈组成的队列(尉 ★★☆☆)  如何仅用递归函数和栈操作逆序一个栈(尉 ★★☆☆)  猫狗队列(士 ★☆☆☆)  用一个栈实现另一个栈的排序(士 ★☆☆☆)  用栈来求解汉诺塔问题(校 ★★★☆)  生成窗口**值数组(尉 ★★☆☆)  构造数组的MaxTree(校 ★★★☆)  求**子矩阵的大小(校 阅读详情

题目:

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:

1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构


首先看下我写的,思路大概就是用两个栈,一个栈用于自定义栈的弹出,压入,辅助栈用于存放最小值,当压入第一个栈的时候,会判断辅助栈是否为空,如果为空也压入,如果不为空,就比较,如果小于等于辅助栈的第一个值,就压入。弹出操作,如果第一个栈弹出的数和辅助栈的第一个数相等,也弹出辅助栈的第一个数,getMin()获取辅助栈的顶部的数据就好。

代码如下:

package 设计一个有getMin功能的栈;

import java.util.Stack;

/**
 * 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
 * ====================
 * 要求:
 * 1.pop、push、getMin操作的时间复杂都是O(1)
 * 2.设计的栈类型可以使用现成的栈结构
 * 
 * @author dream
 *
 */
public class MyStack1 {

    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack1()
    {
        stackData = new Stack<Integer>();
        stackMin = new Stack<Integer>();
    }

    /**
     * 压入操作
     * @param newNum
     */
    public void push(int newNum)
    {
        if(stackMin.isEmpty())
        {
            stackMin.push(newNum);
        }
        stackData.push(newNum);
        if(newNum <= stackMin.peek())
        {
            stackMin.push(newNum);
        }
    }

    /**
     * 弹出操作
     * @return
     */
    public int pop()
    {
        if(stackData == null)
        {
            throw new RuntimeException("Your Stack isEmpty");
        }
        int value = stackData.pop();
        if(stackMin.peek() == value)
        {
            stackMin.pop();
        }
        return value;
    }

    public int getMin()
    {
        if(stackMin.isEmpty())
        {
            throw new RuntimeException("Your stack is Empty.");
        }
        return stackMin.peek();
    }

    public static void main(String[] args) {
        MyStack1 stack1 = new MyStack1();
        stack1.push(3);
        stack1.push(2);
        stack1.push(1);
        int stack = stack1.pop();
        int min = stack1.getMin();
        System.out.println(stack + "" + min + "");
    }

}

看下书上是如何写的:


import java.util.Stack;

public class MyStack1 {

    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack1()
    {
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }

    public void push(int newNum)
    {
        if(this.stackMin.isEmpty())
        {
            this.stackMin.push(newNum);
        }
        else if(newNum <= this.getmin())
        {
            this.stackMin.push(newNum);
        }
        this.stackData.push(newNum);
    }

    public int pop()
    {
        if(this.stackData.isEmpty())
        {
            throw new RuntimeException("Your stack is Empty.");
        }
        int value = this.stackData.pop();
        if(value == this.getmin())
        {
            this.stackMin.pop();
        }
        return value;
    }

    public int getmin()
    {
        if(this.stackMin.isEmpty())
        {
            throw new RuntimeException("Your stack is empty.");
        }
        return this.stackMin.peek();
    }
}

可以看出我写的不规范,pop操作应该是if-else的关系。

书上给出第二种设计方案:


其实差不多,就是在push操作的时候,如果stackData压入的数据大于等于stackMin的顶部元素的时候,StackMin重复压入顶部元素,这样,pop的时候,每次MinStack都弹出就可以了。

代码如下:


import java.util.Stack;

public class MyStack2 {

    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack2()
    {
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }

    public void push(int newNum) {
        if (this.stackMin.isEmpty()) {
            this.stackMin.push(newNum);
        } else if (newNum < this.getmin()) {
            this.stackMin.push(newNum);
        }
        else {
            int newMin = this.stackMin.peek();
            this.stackMin.push(newMin);
        }
        this.stackData.push(newNum);
    }

    public int pop() {
        if (this.stackData.isEmpty()) {
            throw new RuntimeException("Your stack is Empty.");
        }
        this.stackMin.pop();
        return this.stackData.pop();
    }

    public int getmin() {
        if (this.stackMin.isEmpty()) {
            throw new RuntimeException("Your stack is empty.");
        }
        return this.stackMin.peek();
    }

}

代码在我的Github上有,欢迎下载查看。

https://github.com/GeniusVJR/Algorithm-Optimal-Solution

《程序员代码面试指南》it名企算法与数据结构题目最优解(第二版)刷题笔记1 由于之前看了牛客网的数据结构和算法的课程知道了左神,现在顺便就买了他的书做做题吧,虽然书的题解都是java实现的,但好在用c++实现难度不大。 第一章 栈和队列 题目一:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小... 阅读详情

相关推荐

【忍者算法】最小栈设计:优雅实现O(1)时间获取最小值!| LeetCode 155「最小栈」

本文介绍了如何设计一个最小栈,以在O(1)时间复杂度内实现push、pop、top和getMin操作。通过使用主栈和辅助栈的双栈结构,辅助栈同步记录当前状态下的最小值,确保所有操作的高效性。文章详细解析了设计思路、代码实现、易错点及优化方案,并提供了空间优化版本。此外,还讨论了该设计思想的扩展应用和面试技巧,帮助读者深入理解并掌握这一数据结构设计方法。

忍者算法的博客 149

设计栈和队列以及相互实现栈和队列

一、设计循环队列(力扣622题: 设计循环队列) public class MyCircularQueue { private int[] elem; private int front; private int rear; public MyCircularQueue(int k) { this.elem = new int[k + 1]; } //入队(队尾入队) public boolean enQueue(int valu

weixin_48252894的博客 603

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9655

【算法】最小栈的实现(getMin)

最小栈的实现

笨鸟学飞的博客 647

告别谷歌翻译失效!手把手教你用Immersive Translate插件实现双语网页阅读(附Chrome/Edge/Firefox保姆级配置)

本文详细介绍了如何使用Immersive Translate插件实现双语网页阅读,解决谷歌翻译失效的问题。通过Chrome、Edge和Firefox的保姆级配置指南,帮助用户轻松安装和使用这款支持双语对照、智能识别网页内容的翻译插件,提升外文资料阅读效率。

weixin_28683689的博客 485

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 238

栈实现getMin

题目 实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作。 要求 pop、push、getMin操作的时间复杂度都是O(1). 设计的栈类型可以使用现成的栈结构。 解答 在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData;另一个栈用于保存每一步的最小值,这个栈记为stackMin。具体实现的方式有两...

weixin_30662849的博客 205

【知识图谱】Neo4j基本操作及数据库文件导入(graph.db.dump)

初探Neo4j导入数据备份数据客户端操作导入csv文件指定csv文件格式使用命令行导入csv文件附录 请读者参考上篇博文 Neo4j安装教程 导入数据 若开启服务,先在终端停止 Neo4j 服务 ./neo4j stop 接下来,下载射雕三部曲的数据库文件 wget https://labfile.oss.aliyuncs.com/courses/1354/graph.db.dump 下载完将出现 graph.db.dump 文件: 将数据库文件导入到 Neo4j 中 首先进入neo4j 根目录下:

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 8617

包含min函数的栈 python_《剑指 Offer (第 2 版)》第 30 题:包含 min 函数的栈

第 30 题:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例:MinStack minStack = new MinStack();minStack.push(...

weixin_39764603的博客 163

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

LibCity:开源的交通预测算法库 | 面向小白,从0到1【SUMO十字路口仿真建模】路网搭建、车辆配置、实现仿真、仿真结果输出

LibCity:开源的交通预测算法库 | 面向小白,从0到1【SUMO十字路口仿真建模】路网搭建、车辆配置、实现仿真、仿真结果输出

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 457

实现GetMin功能的栈

【题目】 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的栈。 【要求】 1、pop、push、getMin操作的时间复杂度都为O(1) 2、设计的站类型可以使用现成的栈结构 栈的一些基本定义模板: //头文件 #include <stack> //模板<类型名> template <t...

暖心~的博客 623

179、运动控制中的行业标准:机器人安全标准ISO 10218

今天这篇笔记,就把我踩过的坑和标准里的硬骨头掰开揉碎讲清楚。

m0_50546716的博客 168

算法最优 设计一个有getMIn功能的栈

题目 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小的元素的操作。 要求 1.pop,push,getMin操作时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。 思路 在设计上,使用两个栈,一个栈保存当前栈中的元素,其功能和一个正常栈没有区别,记为stackData,另一个栈用于保存每一次比较的最小值,记为stackMin,具体方法有两种: 一,压入数据规则 假设...

树莓一只猪 197

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1243

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计一个有getMin功能的栈

栈和队列的应用 设计一个有getMin功能的栈 【题目】 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 【要求】 1.pop,push,getMin操作的时间复杂度是O(1) 2.设计的栈类型是我们自己实现的栈 【解答】 我们用两个栈来实现上述的题目,(stackData)用来保存当前栈中的元素;(stackMin)保存每一步的

编程小白的进阶之路 430

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

(算法优化) 栈和队列(1)--设计一个有getMin功能的栈

题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 要求: 1、pop、push、getMin操作的时间复杂度都是O(1)  2、设计的栈类型可以使用现成的栈结构 解析:设置两个栈stackData和stackMin,stackData用来保存压入栈的元素,stackMin用来保存每一步的最小值。当压入stackData中的元素小于或等于stackMin的...

QiuGuoJing的博客 379

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【01】设计一个有getMin功能的栈

/* 说明:这些例子来自 左程云著的《程序员代码面试指南 IT名企算法与数据结构题目最优解》。代码中的注释是自己的理解。 */ /* 【题目】实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 【要求】 1.pop、push、getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以使用现成的栈结构 【解答】:在设计上使用两个栈,一个栈用来保存当前栈中的元素,记为stackData;另外一个栈用于保存每一步中的最小值,记为stackMin。 */ /*方案1*/ public c

qq_36346625的博客 142

设计一个有getmin功能的栈

设计一个有getmin功能的栈 程序员代码面试指南 IT名企算法与数据结构题目最优解 第一问 有这样的一个问题: 设计一个栈,实现栈的基本功能的基础上,在实现返回栈中的最小元素操作。 这个问题看似不难,只要在栈push每一个元素的时候将这个元素和一个最小数min进行大小比较,小于min就把这个元素的值赋给min,如此一来就可以得出所有入栈元素的最小值。但是这有一个问题:即将栈顶元素po...

xzsww123的博客 267

【算法】LeetCode 155—最小栈 - 详解与实现

本文介绍了如何实现一个在常数时间内检索最小元素的栈(MinStack)。通过使用双栈设计(普通栈+辅助最小栈),详细解析了push、pop、top和getMin操作的实现原理,并提供了完整的C++代码实现。文章强调当新元素≤当前最小值时同步压入最小栈,出栈时若栈顶等于最小值则同步弹出最小栈的优化策略,确保所有操作时间复杂度均为O(1)。该解法是栈结构经典的应用场景,适用于算法基础学习和面试准备。

qq_2778465975的博客 2038

IT名企算法与数据结构题目最优解--栈和队列

前言 最近在看算法相关的书,无意中看到了这本《程序员代码面试指南:IT名企算法与数据结构题目最优解》 由于书中的代码使用Java实现的,所以我这里用swift去实现了一遍,即当作锻炼,也为了以后复习方便点(毕竟我看swift比看Java容易)。还有就是这里我只贴了该书的题目,并没有贴详细的推导过程,虽然代码里面有部分的注释,但是还是希望大家能买书去参考。废话不多说,直接看题. 设计一个有getM...

weixin_33922670的博客 231

【LeetCode】155. Min Stack 最小栈

题目链接:155. Min Stack 最小栈 解题思路: 使用两个栈来实现本题要求,一个栈用于保存所有元素,这个栈与普通栈没有区别,记为stackData;另一个栈用于保存每一步的最小值,记为stackMin。 push(x)操作 - 将元素 x 推入栈中。 当前元素记为newNum,压入stackData。然后判断stackMin是否为空: 若stackMin为空,也入栈; 若stack...

ME__WE的博客 308

【刷题 issue1】程序员代码面试指南 —— IT 名企算法与数据结构题目最优解

第一章 栈和队列 1.1 设计一个有 getMin 功能的栈 【题目】 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 【要求】 pop、push、getMin 操作的时间复杂度都是 O(1)。 设计的栈类型可以使用现成的栈结构。 【难度】 士 ★☆☆☆ 【题解】 数据结构采用两个栈:一个用来保存当前栈中的元素,记为 stackData;另一个栈用于保存每一步操作...

peabits' Web Log 541

算法题解记录--155最小栈

这道题的关键在于如何在常数时间内获取最小值。使用辅助栈的方式非常巧妙,利用了栈的“后进先出”特性,保证了最小值的同步更新。这是一个典型的“空间换时间”的优化策略,也是面试中非常经典的问题。如果你有更好的解法或者不同的思路,欢迎在评论区留言交流!

weixin_62411896的博客 443

从一个增强型的栈上 获得的启示

前言 要感谢的人 浅析正题 题目要求 题目 要求 实现思路 数据栈 排位栈 双栈怎么配合 实现的两种方式 我的代码实现 收获与启示 前言 要感谢的人 临近暑假结束的时候,收到一封私信。是来自http://blog.youkuaiyun.com/u011068702 博友的。并向我推荐了一本好书。 ...

weixin_34233618的博客 97

栈与队列算法面试核心解析与实战技巧

栈与队列是计算机科学中最基础的线性数据结构,栈遵循LIFO(后进先出)原则,队列遵循FIFO(先进先出)原则。其O(1)时间复杂度的核心操作使它们成为解决特定问题的利器,如逆波兰表达式求值、括号匹配等场景。在技术面试中,约70%的候选人会在栈与队列题目上出现失误,主要原因是缺乏系统性训练。通过LeetCode经典题型如最小栈、用队列实现栈等案例,可以掌握数据结构特性与算法思想的结合应用。掌握这些基础数据结构对提升编程能力和通过技术面试至关重要,特别是在处理具有嵌套特性或需要保存历史状态的问题时。

weixin_30920853的博客 507
上一篇: [算法]年终奖
下一篇: [架构]我眼中的Android架构
陶程
博客等级 码龄12年 360粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值