算法通关村第四关——最大栈问题解析

力扣716,设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。

分析

在最大栈的问题上,除了实现普通栈拥有的方法poppushtop外,还需要实现getMax方法来找到当前栈里的最大值。为了在最短事件内获得栈中的最大值,就不应该在执行getMax()方法时再去计算最小值,最好应该在push或者pop的过程中就应该计算好当前栈中的最大值。还应有popMax()检索并删除栈中最大值,并返回该值。

思路:基于栈后进先出的特点,那么在将一个数a压入栈中时,如果栈里已经存在b,c,d,那么无论这个栈之后执行什么操作,如果a在栈中,b,c,d就一定在栈中,因为在a被弹出之前,b,c,d不会被弹出,在操作过程中的任意一个时刻,只要a在栈顶,那么栈里的元素就一定是a,b,c,d。既然如此,我们就可以在每个新元素a入栈时,把当前栈中的最大值maxValue存储到另外一个辅助栈中,这样在后面的操作过程中只要栈顶元素为a,我们就可以用getMax()直接返回当前栈中最大值。在将栈顶元素pop时,我们同步将辅助栈中栈顶元素弹出,这样就可以保证只要辅助栈不为空,辅助栈里的栈顶元素始终都是当前栈的最大值。

在这里插入图片描述

将最大值存入辅助栈的算法步骤如下:

  • 当一个元素要入栈时,我们去当前辅助栈的栈顶的最大值与当前元素进行比较,得出最大值后将这个最大值压入辅助栈中。
  • 当一个元素要出栈时,我们把辅助栈的栈顶元素同步弹出。

删除栈里的最大值的算法步骤如下:

  • 创建一个缓冲栈,将原栈栈顶元素依次与辅助栈栈顶元素比较,如果小于辅助栈栈顶元素,就pop原栈顶元素并将其压入缓冲栈中保存,如果等于辅助栈栈顶元素就执行pop操作,同时弹出辅助栈栈顶元素。
  • 再将缓冲栈里的元素push回原栈,并返回最大值。

代码如下:

let MaxStack = function() {this.topIndex = -1;this.originStack = [];this.maxValueStack = [];
}/*** @param {number} val* @return {void}* */
MaxStack.prototype.push(val) {this.originStack.push(val);let maxValue = (this.maxValueStack.length === 0 ? val : this.maxValueStack.at(this.topIndex))this.maxValueStack.push(Math.max(maxValue, val);
}/*** @return {number}* */
MaxStack.prototype.pop() {this.maxValueStack.pop();return this.originStack.pop();
}/*** @return {number}* */
MaxStack.prototype.top() {return this.originStack.at(topIndex);
}/*** @return {number}* */
MaxStack.prototype.peekMax() {return this.maxValueStack.at(this.topIndex);
}/*** @return {number}* */
MaxStack.prototype.popMax() {let maxValue = peekMax();const buffer = [];while (top() !== maxValue) buffer.push(pop());pop();while (buffer.length !== 0) {push(buffer.pop());}return maxValue;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55684.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【雕爷学编程】Arduino动手做(187)---1.3寸OLED液晶屏模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

使用webpack建立React+TS项目

之前写过类似的文章,这次看到一本新书里也介绍了这个知识点,故尝试之。 Refer: 《Learn React With TypeScript - A Beginners Guide To Reactive Web Development With React 18 and TypeScript》chapter3 Creating a project with webpack 1.先建立一…

CS 144 Lab Six -- building an IP router

CS 144 Lab Six -- building an IP router 引言路由器的实现测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Lab Checkpoint 5: building an IP router 引言 在本实验中,你将在现有的NetworkInterface基础上实现一个IP路由器&#xf…

【Shader 挖坑01】Split RGB:从水下焦散到故障效果

写在前面 最近又在写水,在焦散效果这里白白的挺单调,叠了一位大佬的方案,Believable Caustics Reflections - Alan Zucconi RGB通道偏移了一下: 采样了三次带来的消耗还蛮大的。先不说这个,这个RGB通道分别采样吧&…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…

K8S系列文章 之 容器网络基础 Docker0

什么是Docker0 使用ip addr命令看一下网卡&#xff1a; rootKitDevVps:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host…

MyCat核心概念、需求案例讲解、环境准备及分片配置

1.MyCat概念介绍 2.MyCat入门需求 2.1 需求分析 2.2 环境准备 输入以下命令检查服务器防火墙状态 dead代表关闭状态&#xff0c;如果不关闭也可以需要开放特定的端口号&#xff01;&#xff01; systemctl status firewalld接着需要在三台服务器上的MySQL上创建三个数据库db0…

渗透攻击方法:原型链污染

目录 一、什么是原型链 1、原型对象 2、prototype属性 3、原型链 1、显示原型 2、隐式原型 3、原型链 4、constructor属性 二、原型链污染重现 实例 Nodejs沙箱逃逸 1、什么是沙箱&#xff08;sandbox&#xff09; 2、vm模块 一、什么是原型链 1、原型对象 JavaS…

PHP8的循环控制语句-PHP8知识详解

我们在上一节讲的是条件控制语句&#xff0c;本节课程我们讲解循环控制语句。循环控制语句中&#xff0c;主要有for循环、while循环、do...while循环和foreach循环。 在编写代码时&#xff0c;经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务&#xff0c;而不是…

8.物联网操作系统之事件标志组

。事件标志组定义 FreeRTOS事件标志组介绍 FreeRTOS事件标志组工作原理 一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步&#xff0c;此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…

高效处理矢量大数据的高可用解决方案

高效处理矢量大数据的高可用解决方案 解决方案目标 存储海量矢量数据实时分析海量矢量数据实现海量矢量数据的可视化提供高可用、高性能和高可拓展性解决方案概述 海量数据查询与可视化 系统技术流程 方案一 数据存储: PostgreSQL+PostGIS(矢量数据存储和空间分析)数据服务…