MinStack 和MaxStack

2023-11-12

leetcode链接
包含min函数的stack

分析

利用一个LinkedList 链表存储数据,类似于链stack, 还有数组stack 采用ArrayList存储
关于如何查找最小元素的情况

思路一 双stack

  1. stack 保存正常的元素情况
  2. min_stack 记录最小元素的顺序,
    上述min_stack存储的也是真正的元素情况,
    == 当加入一个元素时,有两种情况下要加入min_stack==
  • 第一次加入 元素,此时min_stack.isEmpty()==true;
  • 当min_stack.peek()>=x时

代码

Java stack当中是没有top(), 具有peek()

class MinStack {
   

    /** initialize your data structure here. */
    Stack<Integer> stack,minStack;
    //
    public MinStack() {
   
        stack =new Stack<>();
        minStack =new Stack<>();
    }
    
    public void push(int x) {
   
        // 如何使保持一样的情况也是要进入
        if(stack.isEmpty() || x<=minStack.peek())
        //  在这种情况下,只有minStack和stack 当中的数量是不一致的 ,如果当前要进入stack的元素要小于
            minStack.push(x);
        stack.push(x);
    }
    
    public void pop() {
   
        if(stack.isEmpty())   return;
        if(stack.peek().intValue()==minStack.peek().intValue())
            minStack.pop();
        stack.pop();
    }
    
    public int top() {
   
    
        return stack.peek();
    }
    
    public int getMin() {
   
        return minStack.peek();
    }
}

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

时间复杂度方面的情况

双stack的主要思想是

思路二:two stack

使用一个min, 记录stack中的最小值,但是也带来了问题,如果最小元素出stack后如何找到下一个最小的元素?
所以还是没有解决该问题
不容易想到用两个栈来存储数据,一个用于正常的存储栈数据,,另一个用于存储前一个栈的最小值。
一个stack存储真正的元素,另一min_stack记录最小元素的情况
成功的案列

终极思路

如何设计一个时间复杂度为O(1),空间复杂度为O(1), 只使用一个stack的情况,减少使用一个stack 的情况,
stack 不是存储真实压入的数据,minfile 是存储真实的最小数据情况
回到原来的思路: 采用一个stack记录数据,minfile记录最小值情况

push

假设要插入的是x , minfile 是最小数据情况

  • 如果stack为空,是第一次插入数据情况,则直接插入, stack.push(x), min = x;
  • 如果stack 不为空,
    - 判断 x 与min 的大小情况,
    - 如果 x>=min 的话, 对最小值没有影响,直接插入即可,也不用更新min
    - 如果 x<min 的话, stack.push(2 * x - min ), 然后让 min =x ; 比如最小值为3, 现在新=2,2小于 3, 所以插入 2* 2-3 =1, 更新min =2;

为何插入2*x-min

==为何要插入2*x-premin 然后 current_min=x ==
主要是为了pop()的stack的元素标志是否是弹出stack中最小的元素
如果stack.peek()小于min, 说明要出弹出的就是最小元素,执行pop()操作要解密update min
如果stack.peek()大于等于min, 说明要min 还是留在stack 里面,不用update min,直接pop()

pop

int y =stack.peek()

  • 如果y 大于或者等于 premin, 说明min 还在stack 中, 所以直接stack.pop() 后即可
  • 如果y 小于 min, 那么说明真在的y 是 min, 直接返回 min然后 更新 min , min = 2 * premin- y,

总结

如果stack.peek < min , 那么原来的数据其实就是min ,真正要压入的数据

说白了就是对数据进行一定程度对变换即可,加密和揭秘过程,如果是stack.peek()>min, 或者x>=min , 直接插入即可,

当x<min ,才需要正在当更新整个数据当过程

**x 代表入stack, y 代表出stack, 即使 stack.peek()
使用这个两个元素与min, 进行一定程度对比较即可
如果 x <min ,需要进行加密压入,同时更新min
如果 y<min, 需要进行解密弹出, 同时更新min
**

package data_struture;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

/**
 * 155. Min Stack
 * Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
 *
 * push(x) -- Push element x onto stack.
 * pop() -- Removes the element on top of the stack.
 * top() -- Get the top element.
 * getMin() -- Retrieve the minimum element in the stack. 要求使用
 */
public class MinStack {
   
    //构造函数情况

    private int min;
    private Stack<Integer> stack;

    public MinStack() {
   
        stack = new Stack<>();
    }

    //压入stack
    public void push(int x) {
   
    //第一次处理整个元素当情况
        if 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MinStack 和MaxStack 的相关文章

  • 内存管理、堆损坏和 C++

    所以 我需要一些帮助 我正在开发一个 C 项目 然而 我认为我已经设法破坏了我的堆 这是基于我添加了一个事实std string给一个类并为其分配另一个类的值std string std string hello Hello world n
  • 是否有不同步的 Java Stack 的直接替代品?

    我有一个使用堆栈数据结构的大型代码库 由我编写 这是为了方便起见 我有时将其用作堆栈 有时将其用作向量 列表 然而 经过性能审查后 我们决定不想为同步安全支付额外费用 我现在需要用非同步结构替换这个结构 并且在代码中多次提到 我很高兴发现
  • ​LeetCode解法汇总82. 删除排序链表中的重复元素 II

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • memcpy 溢出边界利用? (破坏堆栈)

    我试图弄清楚这是否会以某种方式溢出 void print address char p arp hw int i hw length size p OFFSET1 189 4 193 memcpy hw addr packet OFFSET
  • ARM GCC 生成函数序言

    我提到 ARM 工具链可以生成不同的函数序言 实际上 我看到两个 obj 文件 vmlinux 具有完全不同的函数序言 第一种情况如下所示 push some registers maybe fp lr lr ommited in leaf
  • 函数内声明的 const 数组是否存储在堆栈中?

    如果这是在函数中声明的 它会在堆栈上声明吗 它是 const 让我想知道 void someFunction const unsigned int actions 8 e1 e2 etc 是的 它们在堆栈上 您可以通过查看此代码片段来了解这
  • 缓冲区溢出攻击(攻击实验室第 2 阶段)

    我有一个缓冲区溢出实验室 我必须为一个名为攻击实验室 http csapp cs cmu edu 3e attacklab pdf 我处于实验室的第二阶段 我必须将代码作为漏洞利用字符串的一部分注入 以使程序指向函数 touch2 的地址
  • 如何找到最大堆栈大小?

    我正在使用 Ubuntu 11 04 如何找出进程的最大调用堆栈大小以及堆栈的每个帧的大小 快速谷歌搜索应该会显示关于这个主题的一些信息 http www cs nyu edu exact core doc stackOverflow tx
  • 在 D 中制作结构体的堆副本

    如何创建堆栈上结构的垃圾收集副本 来自 C 背景 我的第一个猜测是像下面这样的复制构造函数 但它对于 D 来说似乎不太惯用 而且我在我看过的任何 D 项目中都没有看到过这样的复制构造函数 struct Foo immutable int b
  • ValueType 堆栈空间耗尽

    我的理解是 Net中的每个新线程都会分配1MB 堆栈空间 https stackoverflow com questions 4088448 the net stack vs windows stack 进一步我的理解是 值类型存储在堆栈上
  • c++ Vector,每当它在堆栈上扩展/重新分配时会发生什么?

    我是 C 新手 我在我的项目中使用向量类 我发现它非常有用 因为我可以拥有一个在必要时自动重新分配的数组 即 如果我想推回一个项目并且向量已达到其最大容量 它会重新分配自身 向操作系统请求更多内存空间 所以访问向量的元素非常快 它不像列表
  • Bluecove:以编程方式重新启动蓝牙堆栈

    我正在尝试关闭蓝牙服务 但 Bluecove 在连接关闭方法上有错误 https code google com p bluecove issues detail id 90 https code google com p bluecove
  • 为什么堆上的内存分配比堆栈上的内存分配慢得多?

    我已经被告知很多次了 但我不知道为什么 从堆分配内存时会涉及哪些额外成本 与硬件有关吗 与CPU周期有关吗 这么多的猜测 但没有确切的答案 有人能给我一些详细说明吗 正如 unwind 所说 Heap数据结构比Stack更复杂 在我看来 当
  • std::stack 是否公开迭代器?

    是否std stack在 C STL 中公开底层容器的任何迭代器 还是应该直接使用该容器 根据堆栈的定义 堆栈没有迭代器 如果您需要带有迭代器的堆栈 则需要自己在其他容器 std list std vector 等 之上实现它 堆栈文档在这
  • 在C语言中,我可以通过堆栈指针访问另一个函数中主函数的局部变量吗?

    我需要访问在 main 函数中定义的变量 a 的值 而不将其作为参数传递 main int a 10 func printf d n a void func i need access of variable a here 我怎样才能做到这
  • 如何从 obj-c / ios 中的堆栈跟踪获取源代码行

    I use NSSetUncaughtExceptionHandler将堆栈跟踪打印到 iPhone 中的本地文件 该文件将在下次应用程序启动时发送到我们的服务器 然后我可以检查异常数据并修复错误 在某些崩溃中 我有模块名称和引发异常的函数
  • 什么是堆栈随机化以及它如何防止缓冲区溢出攻击?

    我从一本书上读到缓冲区溢出可能被用作注入攻击系统的漏洞代码的一种方式 和堆栈随机化是防止此类攻击的有效方法之一 我不明白是什么堆栈随机化以及它如何防止这些攻击 代替堆栈随机化克服 或更难 堆栈或缓冲区溢出的技术称为地址空间布局随机化 ASL
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • Push 和 Pop 对堆栈意味着什么?

    长话短说 我的讲师很糟糕 他通过投影仪向我们展示前缀堆栈的中缀 他的大影子挡住了一切 所以我错过了重要的东西 他指的是push和pop push 0 pop x 他举了一个例子 但我根本看不出他是如何得到答案的 2 3 2 1 5 4 1

随机推荐

  • 可以学学Golang、(Go的优势及适合做什么

    1 关键字少 运维简单 2 原生支持高并发 GOROUTINE 协程 进程是资源分配的最小单位 线程是CPU调度的最小单位 一个线程可以有上千个协程 不是在CPU层面去调度的 是在用户空间用Golang的一个调度器去调度不同的协程 由于协程
  • 计算机基础一:IP地址与域名解析

    一 Free IP Scanner 1 是免费的局域网IP地址扫描软件 它简单地Ping每个IP地址以检查它是否还活着 2 可以扫描出某一个局域网中所有的ip地址 正在用的IP地址和没有使用的ip地址 3 可以扫描对应的网卡MAC地址 计算
  • python日常实用技能:如何用Python将图片批量从png格式转换至WebP格式

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 最近因为工作需要去研究了下png的压缩 发现转换成webp格式可以小很多 下面给大家分享利用Python将图片批量从png格式转换至WebP格式的方法 下面来一起看看 实现
  • 远程部署java web项目_JavaWeb项目的部署以及远程调试

    Linux环境下软件的安装 Linux环境下的程序的安装 更新 卸载和查看 rpm 命令 相当于windows程序的添加 卸载程序 进程程序的安装 查看 卸载 本地程序安装 rpm ivh 程序名 本地程序查看 rpm qa 本地程序卸载
  • 4分钟插入1000万条数据到mysql数据库表

    准备工作 我用到的数据库为 mysql数据库8 0版本的 使用的InnoDB存储引 创建测试表 CREATE TABLE product id int NOT NULL AUTO INCREMENT name varchar 100 DEF
  • C++读取HDF5文件

    我将博客迁到 GitHub pages 了 本文有些纰漏 请前往 pages 查看 概述 HDF5是一种跨平台存储 高维 数组的数据格式 HDF5有多种语言的绑定 其中包括C 在这里我记录了各种踩坑后如何将数据读入C 读标量 注意头文件不是
  • vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

    vscode报错如下 一 第一种情况 原因是本地的known hosts文件记录服务器信息与现服务器的信息冲突了 导致连接失败 解决方案就是把本地的known hosts的原服务器信息全部删掉 然后重新连接 二 第二种情况 在编写配置文件c
  • SFuzz: Slice-based Fuzzing for Real-Time Operating Systems

    原文地址 SFuzz Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security 源码地址 NSSL SJTU SFuzz gi
  • Python面向过程编程主要知识

    摘自尚学堂的python 人工智能课程 用于复习 python是一种解释型的 面向对象的语言 python的特点 1 可读性强 易修改 2 简介 关注业务本身 生产效率高 3 面向对象 4 免费和开源 5 可移植性和跨平台 python被编
  • spring框架学习之路(一)-入门基础(1)-IOC(控制反转)&DI(依赖注入)

    前言 我就是一小白程序猴 不懂什么高新技术 只是在学习过程中把自己遇到问题或者学到的新知识记录下来 第一给自己复习用 第二小白更懂小白的苦 自己是新手所以应该更了解在刚开始学习时哪些学起来有困难 也就避开了所谓的专家盲点 给后面入坑的人一点
  • 【深度学习】使用kaggle提供的免费GPU在线训练模型

    背景 自己电脑没有GPU 只能找找网上的平台来跑模型 但是又买不起服务器 只能使用免费的平台这样子 免费的在线平台 各大计算平台免费GPU资源总结 本文要介绍的就是第三个 虽然是国外的 但是不用翻墙就可以访问 每周免费30小时使用时长 显卡
  • JAVA操作共享文件夹文件、下载、读取(windows、Linux通用)

    一 导入包 maven中央仓库https mvnrepository com artifact org samba jcifs jcifs 1 3 3
  • 在C#中??和?分别是什么意思?

    在C 中 和 分别是什么意思 1 可空类型修饰符 引用类型可以使用空引用表示一个不存在的值 而值类型通常不能表示为空 例如 string str null 是正确的 int i null 编译器就会报错 为了使值类型也可为空 就可以使用可空
  • 背完这套Java面试八股文,自动解锁面试牛逼症被动技能

    前言 国内的互联网面试 恐怕是现存的 最接近科举考试的制度 很多人对八股文都嗤之以鼻 认为无法衡量出一个程序员的真是水平 还有一部分人则是深恶痛绝 因为实在太难背了 但是国内大环境如此 互联网IT行业的求职者太多了 如果考察的是清一溜的算法
  • Weex 项目总结

    在项目中 我觉得暂时有两个地方需要总结一下 一个是weex内部的数据请求 一个是原生方法得调用 数据请求 在PC端调试的话会有跨域问题 在手机端没有跨域问题 原生方法需要原生开发者根据 Weex文档 写一个module 再暴露出一个方法给前
  • 解决springboot 项目配置文件指定端口号没生效

    方法1 指定启动端口号8022 覆盖配置文件 SpringBootApplication public class FadadaApplication public static void main String args SpringAp
  • Unity使用mesh绘制模型

    基本概念 首先要知道模型是如何产生的 比如说我们在一个3 3的空间创建这样9个点 vector3 这9个点构成了我们模型的范围 三点成三角 三角呈面 然后由面绘制出体 用这种方法可以绘制我们想要的图形 理论转为实践 第一步 绘制点 先将刚才
  • Vue 路由守卫详细介绍与演示

    Vue 路由守卫是一种在 Vue js 应用程序中控制路由导航的机制 它允许你在路由变化前 后或在特定路由上执行代码 以便实现诸如权限控制 数据加载 页面切换动画等功能 在下面的介绍中 我将首先提供官方定义和通俗解释 然后详细介绍全局前置路
  • python练习题(十九):有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前n项之和

    题目 有一分数序列 2 1 3 2 5 3 8 5 13 8 21 13 求出这个数列的前n项之和 n int input 请输入求和项数 n sum 0 记录前n项和 a 1 分母 b 2 分子 for i in range n n su
  • MinStack 和MaxStack

    leetcode链接 包含min函数的stack 分析 利用一个LinkedList 链表存储数据 类似于链stack 还有数组stack 采用ArrayList存储 关于如何查找最小元素的情况 思路一 双stack stack 保存正常的