精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘
目录
- 括号匹配问题
- 最小栈
- 最大栈
最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值,而最小栈用于存储当前匹配的最小值。
括号匹配问题
这个问题我们来看力扣20题的描述:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
对于这个题我们有两种解决思路:
1.我们用哈希表把所有符号先存储起来,左边符号作key,右边符号作value。遍历字符串的时候,遇见左边符号就入栈,遇见右边符号就与栈顶的符号进行比较,不匹配就返回false。
public boolean isValid(String s) {//获取字符串长度int n = s.length();//如果字符串长度为奇数,则返回falseif (n % 2 == 1) {return false;}//创建一个HashMap,用于存储字符串中的括号Map<Character, Character> map = new HashMap<>();map.put('[', ']');map.put('(', ')');map.put('{', '}');//创建一个栈,用于存储字符串中的括号Stack<Character> stack = new Stack<>();//遍历字符串中的每一个字符for (int i = 0; i < s.length(); i++) {char item = s.charAt(i);//如果字符串中的字符在HashMap中存在,则将其压入栈中if (map.containsKey(item)) {stack.push(item);} else {//如果栈不为空,则弹出栈顶元素,如果弹出的元素与当前字符串中的字符不匹配,则返回falseif (stack.isEmpty() == false) {char pop = stack.pop();if (map.get(pop) != item) {return false;}} else {return false;}}}//如果栈为空,则返回true,否则返回falsereturn stack.isEmpty();}
- 单纯的使用栈,如果遇见左边符号直接压入栈中,遇见右边的符号是先判断栈是否为空,为空则返回false,不为空则弹出栈顶元素,如栈顶元素不为相匹配的左边符号则直接返回false,最后元素遍历完返回栈是否为空。
public boolean isValid(String s) {int n = s.length();// 如果字符串长度为奇数,则直接返回falseif (n % 2 == 1) {return false;}// 创建一个栈Deque<Character> stack = new LinkedList<>();// 遍历字符串for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 如果当前字符为左括号,则将其压入栈中if (c == '(' | c == '[' || c == '{') {stack.push(c);// 如果当前字符为右括号,则从栈中弹出一个元素,如果弹出的元素与当前字符不匹配,则返回false} else if (c == '}' || c == ']' || c == ')') {if (stack.isEmpty()) {return false;}char top = stack.pop();if ((top != '(' && c == ')') || (top != '{' && c == '}') || (top != '[' && c == ']')) {return false;}}}// 如果栈为空,则返回true,否则返回falsereturn stack.isEmpty();}
最小栈
我们来看力扣155题的描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素val推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
这个题通俗的理解就是给栈提供一个能获取最小元素的方法并且要在常数时间内。
我们可以设计一个辅助栈,与元素栈同步插入与删除,用于存储每个元素入栈时的最小值(也就是说在辅助栈中我们每次插入的是元素栈中的最小值)

- 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前要入栈的元素中的最小值插入辅助栈中。
- 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出。
我们来看具体实现代码:
class MinStack {// 定义两个双端队列,分别存放输入的值和当前的最小值Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {// 初始化双端队列xStack = new LinkedList<>();minStack = new LinkedList<>();// 第一个最小值设置为最大值minStack.push(Integer.MAX_VALUE);}public void push(int val) {// 输入一个值xStack.push(val);// 将当前的最小值和输入的值比较,取较小的值minStack.push(Math.min(minStack.peek(), val));}public void pop() {// 弹出双端队列的最后一个值xStack.pop();minStack.pop();}public int top() {// 返回双端队列的最后一个值return xStack.peek();}public int getMin() {// 返回双端队列的最小值return minStack.peek();}
}
最大栈
跟最小栈实现方法类似寻找最大值。
需要注意的就是最后一个方法,弹出最大值,具体就是拿到最大元素,然后在数字栈中把最大值以上的元素全部弹出存储在新建的栈中,然后弹出最大值,最后把新建的栈中的元素重新压入数字栈中。
由于力扣最大栈是VIP题目,我们可以尝试一下牛客的最大栈问题。
class MaxStack {// 定义两个栈,一个用来存储数字,另一个用来存储最大值Deque<Integer> xStack;Deque<Integer> maxStack;public MaxStack() {// 初始化两个栈xStack = new LinkedList<>();maxStack = new LinkedList<>();}public void push(int val) {// 获取当前最大值,如果栈为空,则最大值为当前值int max = maxStack.isEmpty() ? val : maxStack.peek();// 比较当前值和最大值,取最大值max = max > val ? max : val;// 将值和最大值分别压入栈中xStack.push(val);maxStack.push(max);}public int pop() {// 弹出最大值栈顶元素maxStack.pop();// 弹出数字栈顶元素return xStack.pop();}public int top() {// 返回数字栈顶元素return xStack.peek();}public int peekMax() {// 返回最大值栈顶元素return maxStack.peek();}public int popMax() {// 获取最大值栈顶元素int max = peekMax();// 创建一个栈Stack<Integer> stack = new Stack<>();// 当栈顶元素不等于最大值时,将栈顶元素压入栈中while (top() != max) {stack.push(pop());}// 弹出数字栈顶元素pop();// 将栈中的元素弹出,压入数字栈中while (!stack.isEmpty()) {push(stack.pop());}// 返回最大值return max;}}
相关文章:
精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘
目录 括号匹配问题最小栈最大栈 最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值,而最小栈用于存储当前匹配的最小值。 括号匹配问题 这个问题我们来看力扣20题的描述: 给定一个只包括 ‘(’,‘)’,‘{’…...
云存储/视频监控管理平台EasyCVR,使用sqlite数据库出现卡顿该如何优化?
视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...
实战!工作中常用的设计模式
文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口,两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…...
MySQL进阶_1.逻辑架构和SQL执行流程
文章目录 第一节、逻辑架构剖析1.1、服务器处理客户端请求1.2、Connectors1.3、第1层:连接层1.4、第2层:服务层1.5、 第3层:引擎层1.6、 存储层1.7、小结 第二节、SQL执行流程2.1、查询缓存2.2、解析器2.3、优化器2.4、执行器 第三节、数据库…...
基于GCC的工具objdump实现反汇编
一:objdump介绍 在 Linux中,一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…...
排序算法的空间复杂度和时间复杂度
一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…...
【电路笔记】-基尔霍夫电路定律
基尔霍夫电路定律 文章目录 基尔霍夫电路定律1、框架和定义2、基尔霍夫电流定律3、基尔霍夫电压定律4、基尔霍夫定律应用5、基尔霍夫定律的局限性6、总结 在本文中,将介绍最基本、最重要的电路定律之一。 这些法律由德国医生古斯塔夫基尔霍夫 (Gustav Kirchoff) 于 …...
从零开始搭建React+TypeScript+webpack开发环境-基于axios的Ajax请求工具
什么是axios axios是一款基于Promise的HTTP客户端,适用于浏览器和Node.js环境。它的特点包括: 支持浏览器和Node.js环境。支持Promise API。支持拦截请求和响应。支持取消请求。自动转换JSON数据。支持CSRF保护。 使用axios可以更方便地发送HTTP请求&…...
【uniapp小程序下载】调用uni.uploadfile方法在调试工具里是没有问题的,但是线上版本和体验版就调用不成功,真机调试也没问题
把你的下载地址前缀添加到合法域名就解决了 在调试工具里成功了是因为勾选了下面这项 下面是我的下载并打开函数 methods: {// 下载downloadFileFn(data) {if (this.detailsObj.currentUserBuy) {uni.downloadFile({// data是路径url: https:// data,success(res) {//保存到本…...
chatGLM中GLM设计思路
GLM是结合了MLM和CLM的一种预训练方式,其中G为general;在GLM中,它不在以某个token为粒度,而是一个span(多个token),这些span之间使用自编码方式,而在span内部的token使用自回归的方式…...
卡牌游戏类型定制开发微信卡牌小程序游戏
卡牌类型的游戏开发具有一些独特的特点和挑战,以下是一些主要的特点: 卡牌设计和平衡:卡牌游戏的核心是卡牌设计和平衡。开发团队需要设计各种卡牌,确保它们在游戏中相互平衡,以便提供有趣的游戏体验。卡牌的特性、效…...
web —— css(1)
Web —— css基础 1. CSS样式表2. CSS的三种引入方式3. CSS 语法4. CSS 选择器4.1 元素选择器4.2 类选择器4.3 ID选择器4.4 属性选择器4.5 后代选择器4.6 子元素选择器4.7 伪类选择器4.8 分组选择器 5. 颜色和字体6. 显示方式display7. 盒子模型7.1 盒子模型 - 外边距塌陷7.2 盒…...
站群服务器的特性和好处是什么
站群服务器的特性和好处是什么 站群服务器的特性是什么?站群服务器是一种为一个网站或多个网站配置独立IP的服务器。因而相比一般的服务器,站群服务器最大的特性就是IP数量是非常的多。那么租用站群服务器使用有什么好处呢? 多网站优化 大…...
竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python
文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…...
软件设计模式的意义
软件设计模式的意义 所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。 为什么好像只能从框架中找到设计模式的应用…...
vue基础知识十八:说说你对keep-alive的理解是什么?
一、Keep-alive 是什么 keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们 keep-alive可以设置以下props属性:…...
Linux CentOS配置阿里云yum源
一:先备份文件,在配置失败时可以恢复 cd /etc/yum.repos.d mkdir back mv *.repo back 二:下载阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel…...
ESP32网络开发实例-Web服务器以仪表形式显示传感器计数
Web服务器以仪表形式显示传感器计数 文章目录 Web服务器以仪表形式显示传感器计数1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 Web页面文件4.2 Web服务器代码实现在本文中,我们将介绍使用服务器发送事件 (SSE) 构建 ESP32 仪表 Web 服务器。服务器将自动向所有连接的网络…...
@Bean有哪些属性
直接看原文 原文链接:Spring中bean标签的作用和属性的详解-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Bean的配置一般都在XML文件进行配置Bean相关包为:or…...
【Qt之绘制兔纸】
效果 代码 class drawRabbit: public QWidget { public:drawRabbit(QWidget *parent nullptr) : QWidget(parent) {}private:void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制兔子的耳朵painter.s…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
