leetcode 155 最小栈

本文介绍了一种特殊栈的设计方法,该栈除了支持基本的push、pop、top操作外,还能在常数时间内检索到栈中的最小元素。通过两种实现方式,一是自定义栈并维护最小值,二是利用现成的Stack类结合辅助栈,实现了getMin方法的快速响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

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

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

示例:

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

分析

分两种,一种自己实现栈,另一种是用现成的Stack类,更关注于如何实现常数getMin 方法。

 public static class MinStack {

        private int min;
        /** 第一次push改变状态,pop完所有元素改变状态 */
        private boolean minInited = false;
        private int[] table;

        private int p = -1;

        public MinStack() {
            table = new int[10];
        }

        public void push(int x) {
            ensureCapacity();
            p++;
            table[p] = x;

            if (!minInited) {
                min = x;
                minInited = true;
            } else {
                if (x < min) {
                    min = x;
                }
            }
        }

        public void pop() {
            //弹出去的正好是最小值,此时需要重新找最小值
            if (p > 0 && table[p] == min) {
                min = table[0];
                for (int i = 0; i <= p - 1; i++) {
                    if (table[i] < min) {
                        min = table[i];
                    }
                }
            }

            p--;
            if (p < 0) {
                p = -1;
                min = 0;
                minInited = false;
                //至此,最小值需要重新初始化
            }
        }

        public int top() {
            return p < 0 ? 0 : table[p];
        }

        private void ensureCapacity() {
            if (p >= table.length - 1) {
                int[] newTable = new int[table.length * 2];
                System.arraycopy(table, 0, newTable, 0, table.length);
                this.table = newTable;
            }
        }

        /**
         * 常数时间
         *
         * @return
         */
        public int getMin() {
            return min;
        }
    }

第二种,使用现成的类

public static class MinStack {

        private Stack<Integer> stack = new Stack<>();
        private Stack<Integer> helper = new Stack<>();


        public MinStack() {

        }

        public void push(int x) {
            stack.push(x);
            helper.push(helper.size()==0?x:Math.min(x,helper.peek()));
        }

        public void pop() {
            stack.pop();
            helper.pop();
        }

        public int top() {
            return stack.peek();
        }


        /**
         * 常数时间
         *
         * @return
         */
        public int getMin() {
            return helper.peek();
        }
    }

以上两种思路占用时间及内存相近,并没有达到太好的跑分。

转载于:https://my.oschina.net/mythss/blog/3021683

内容概要:本文档是上海理工大学光电信息与计算机工程学院学生周文龙撰写的《光电融合集成电路路技术》设计报告,指导教师为隋国荣。报告分为两个部分:一是音乐梦幻灯设计,二是USB转接器仿真设计。音乐梦幻灯设计部分,以单片机为核心,通过硬件电路和软件编程实现简易电子琴,能够自动播放音乐并在电源接通时显示LED灯,详细介绍了硬件组成、原理图、元件清单及调试过程;USB转接器仿真设计部分,旨在搭建USB转接器电路,熟悉AD和嘉立创EDA等仿真平台的操作,绘制并验证电路原理图和PCB制版图,掌握焊接工艺和电路测试,为未来从事电工电子技术行业打下基础。 适合人群:电气工程、自动化、计算机等相关专业的大专院校学生,以及对单片机应用和电子电路设计感兴趣的初学者。 使用场景及目标:①学习单片机控制电子琴的原理和实现方法,包括硬件设计和软件编程;②掌握USB转接器电路的设计流程,包括原理图绘制、仿真、PCB制版图设计和电路板焊接;③提升实际动手能力和解决实际问题的能力,为未来从事相关行业打下基础。 阅读建议:本报告详细记录了设计过程中的每一个环节,包括理论知识的应用和实际操作的经验,建议读者在阅读过程中结合实际操作,逐步理解和掌握每个步骤的具体实现方法。同时,可以参考报告中提到的相关文献和工具,加深对单片机和电子电路设计的理解。
内容概要:PT5000汽轮机滑动轴承系统模拟试验台是一个类似于电厂汽轮机发电机的缩小模型,旨在帮助用户获取汽轮机转子动态行为和滑动轴承油膜现象的实际经验,并研究振动控制方法。该试验台模拟两级涡轮机(低压和中压),每级转子两侧各有8个叶片,共计16个叶片。通过电机驱动而非涡轮发电机,可以进行启停机测试,识别共振现象。试验台还支持多种实验,如不平衡/现场动平衡、轴不对中实验、摩擦实验、油膜故障试验、轴颈轴承实验以及根据油压和温度进行的转子动力学试验。试验台配备了多种传感器和控制系统,包括电涡流传感器、温度传感器、压力传感器等,用于监测和记录实验数据。 适合人群:从事汽轮机设计、制造、维护的技术人员,以及相关专业的高校师生和研究人员。 使用场景及目标:①研究汽轮机转子的动态行为和滑动轴承的油膜现象;②进行振动控制方法的研究;③模拟再现油膜涡动转和油膜震荡,研究其控制条件;④进行不平衡、不对中、摩擦等常见故障的模拟和分析;⑤通过调整油压、温度和预加载力,研究轴的行为变化。 其他说明:该试验台不仅适用于教学和科研,还可用于工业领域的培训和技术验证。试验台具有丰富的配置和可选配件,可以根据具体需求进行定制。试验台的机械和电气参数详细列出,确保用户能够全面了解设备性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值