力扣hot100-->栈/单调栈

栈/单调栈

1. 20. 有效的括号

简单

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[ ]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([ ])"

输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

// 定义一个名为Solution的类,用于解决括号有效性问题。
class Solution {
public:
    // 函数isValid用于检查输入的字符串s是否是有效的括号序列。
    bool isValid(string s) {
        // 定义一个字符栈st,用于存放预期的闭括号。
        stack<char> st;

        // 获取输入字符串s的长度。
        int n = s.size();

        // 遍历字符串s中的每个字符。
        for(int i{}; i < n; ++i) {
            // 如果当前字符是开括号'(',则将对应的闭括号')'推入栈中。
            if(s[i] == '(') {
                st.push(')');
            } else if(s[i] == '[') {
                // 如果当前字符是开括号'[',则将对应的闭括号']'推入栈中。
                st.push(']');
            } else if(s[i] == '{') {
                // 如果当前字符是开括号'{',则将对应的闭括号'}'推入栈中。
                st.push('}');
            } else {
                // 如果当前字符是闭括号,检查栈是否为空或者栈顶元素是否与当前闭括号匹配。
                // 如果栈为空,或者栈顶元素与当前闭括号不匹配,则说明括号序列无效,返回false。
                if(st.empty() || st.top() != s[i]) return false;

                // 如果栈顶元素与当前闭括号匹配,则弹出栈顶元素。
                st.pop();
            }
        }

        // 遍历结束后,如果栈为空,则说明所有开括号都找到了匹配的闭括号,返回true。
        // 如果栈不为空,则说明有未匹配的开括号,返回false。
        return st.empty();
    }
};

2. 155. 最小栈

中等

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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

提示:

  • -231 <= val <= 231 - 1
  • poptop 和 getMin 操作总是在 非空栈 上调用
  • pushpoptop, and getMin最多被调用 3 * 104 次

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        // 如果s2为空或者val小于等于s2的栈顶元素,则将val压入s2
        if(s2.empty() || val <= s2.top()) s2.push(val);
        // 将val压入s1
        s1.push(val);
    }
    
    void pop() {
        // 如果两个栈都为空,则直接返回
        if(s1.empty() && s2.empty()) return;
        // 如果s1的栈顶元素等于s2的栈顶元素,则也需要从s2中弹出元素
        if(s1.top() == s2.top()) s2.pop();
        // 从s1中弹出元素
        s1.pop();
    }
    
    int top() {
        // 如果s1为空,则返回-1表示栈为空
        if(s1.empty()) return -1;
        // 返回s1的栈顶元素
        return s1.top();
    }
    
    int getMin() {
        // 如果s2为空,则返回-1表示栈为空
        if(s2.empty()) return -1;
        // 返回s2的栈顶元素,即当前栈中的最小值
        return s2.top();
    }
private:
    stack<int> s1;
    stack<int> s2;
};

解释:

 pop方法中,返回空(null)是因为pop操作本身不返回任何值,它只是移除栈顶元素。如果栈为空,那么就没有元素可以移除,所以返回空表示没有操作发生。

top方法:当s1为空时,意味着栈中没有任何元素,因此没有栈顶元素可以返回。在这种情况下,返回-1作为一个标志值,表示栈为空。这是因为-1通常不会是一个合法的栈元素值,所以可以用作一个错误标志。

getMin方法:同样,当s2为空时,意味着没有最小值可以返回(因为栈中没有任何元素)。因此,返回-1作为一个标志值,表示栈为空。

3. 394. 字符串解码

中等

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300] 

  class Solution {
public:
    string decodeString(string s) {
        string res = ""; // 用于构建最终的解码字符串
        stack<int> nums; // 用于存储数字,这些数字表示重复的次数
        stack<string> strs; // 用于存储字符串片段
        int num = 0; // 用于记录当前读取的数字
        int len = s.size(); // 字符串s的长度
        for(int i = 0; i < len; ++i) {
            if(s[i] >= '0' && s[i] <= '9') {
                // 如果当前字符是数字,则累加到num中
                num = num * 10 + s[i] - '0';
            } else if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {
                // 如果当前字符是字母,则添加到res中
                res = res + s[i];
            } else if(s[i] == '[') {
                // 如果遇到'[',则将之前的数字和字符串片段压栈
                nums.push(num);
                num = 0;
                strs.push(res);
                res = "";
            } else {
                // 如果遇到']',则进行解码操作
                int times = nums.top();
                nums.pop();
                for(int j = 0; j < times; ++j)
                    strs.top() += res;
                res = strs.top();
                strs.pop();
            }
        }
        return res; // 返回解码后的字符串
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中mixin(混入)的使用

目录 mixin(混入) 使用方式 第一步定义混合 ​编辑 第二步使用混入 局部混入 全局混合 mixin(混入) 功能&#xff1a;可以把多个组件共用的配置提取成一个混入对象 使用方式 第一步定义混合 { data(){....}, methods:{....} .... } 第二步使用混入 …

Block Successive Upper Bound Minimization Method(BSUM)算法

BSUM优化方法学习 先验知识参考资料1 A Unified Convergence Analysis of Block Successive Minimization Methods for Nonsmooth OptimizationSUCCESSIVE UPPER-BOUND MINIMIZATION (SUM) 连续上限最小化算法THE BLOCK SUCCESSIVE UPPER-BOUND MINIMIZATION ALGORITHM 块连续上…

[STM32]从零开始的STM32 HAL库环境搭建

一、前言 之前在搭建STM32的标准库环境时就告诉过大家&#xff0c;开发STM32的方式主要有三种。一种是最原始但是效率最高的寄存器开发&#xff0c;另一种是效率仅次于寄存器难度相对较低的标准库开发&#xff0c;最后一种是最为简单但是程序效率最低的HAL库开发。如果对于初学…

【论文笔记】Large Brain Model (LaBraM, ICLR 2024)

Code: https://github.com/935963004/LaBraM Data: 无 目录 AbstractIntroductionMethodNeural tokenizer training&#xff1a;Pre-training LaBraM&#xff1a; ResultsExperimental setup&#xff1a;Pre-training result&#xff1a;Comparison with SOTA&#xff1a;Pre-t…

AnythingLLM - 任何文档资源内容转换为任何LLM

更多AI开源软件&#xff1a; AI开源 - 小众AIhttps://www.aiinn.cn/sources 一个全栈应用程序&#xff0c;使您能够将任何文档、资源或内容转换为任何 LLM 都可以在聊天期间用作参考的上下文。此应用程序允许您选择要使用的 LLM 或矢量数据库&#xff0c;并支持多用户管理和权…

PDF内容提取,MinerU使用

准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…

【阅读记录-章节3】Build a Large Language Model (From Scratch)

目录 3 Coding attention mechanisms3.1 The problem with modeling long sequences背景&#xff1a;注意力机制的动机 3.2 Capturing data dependencies with attention mechanismsRNN的局限性与改进Transformer架构的革命 3.3 Attending to different parts of the input wit…

Kubernetes配置管理ConfigMap、Secret

Your burden will become a gift, and your suffering will light your way. 应用部署的一个最佳实践是将应用所需的配置信息与程序分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在…

141. Sprite标签(Canvas作为贴图)

上节课案例创建标签的方式&#xff0c;是把一张图片作为Sprite精灵模型的颜色贴图,本节给大家演示把Canvas画布作为Sprite精灵模型的颜色贴图&#xff0c;实现一个标签。 注意&#xff1a;本节课主要是技术方案讲解&#xff0c;默认你有Canvas基础&#xff0c;如果没有Canvas基…

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本&#xff0c;本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例

1. UDP回声服务器简介 回声服务器指的是这样一种服务器&#xff0c;它接受客户端的连接&#xff0c;并且把收到的数据原样返回给客户端&#xff0c;本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器&#xff0c…

【WPF】Prism学习(七)

Prism Dependency Injection 1.注册类型&#xff08;Registering Types&#xff09; 1.1. Prism中的服务生命周期&#xff1a; Transient&#xff08;瞬态&#xff09;&#xff1a;每次请求服务或类型时&#xff0c;都会获得一个新的实例。Singleton&#xff08;单例&#xf…

springboot基于Hadoop的NBA球员大数据分析与可视化(1)(6)

摘 要 科学技术日新月异&#xff0c;人们的生活都发生了翻天覆地的变化&#xff0c;NBA球员大数据分析与可视化系统当然也不例外。过去的信息管理都使用传统的方式实行&#xff0c;既花费了时间&#xff0c;又浪费了精力。在信息如此发达的今天&#xff0c;可以通过网络这个媒…

Q3净利增长超预期,文心大模型调用量大增,百度未来如何分析?

首先&#xff0c;从百度发布的2024年第三季度财务报告来看&#xff0c;其净利润同比增长17%&#xff0c;超出了市场预期&#xff0c;显示出百度整体财务表现的强劲。这一增长不仅体现在总营收和百度核心营收上&#xff0c;更具体地反映在归属百度核心的净利润上&#xff0c;这标…

Vscode/Code-server无网环境安装通义灵码

Date: 2024-11-18 参考材料&#xff1a;https://help.aliyun.com/zh/lingma/user-guide/individual-edition-login-tongyi-lingma?spma2c4g.11186623.0.i0 1. 首先在vscode/code-server插件市场中安装通义插件&#xff0c;这步就不细说了。如果服务器没网&#xff0c;会问你要…

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS&#xff0c;并结合cpolar内网穿透工…

实战 | C#中使用YoloV8和OpenCvSharp实现目标检测 (步骤 + 源码)

导 读 本文主要介绍在C#中使用YoloV8实现目标检测,并给详细步骤和代码。 详细步骤 【1】环境和依赖项。 需先安装VS2022最新版,.NetFramework8.0,然后新建项目,nuget安装 YoloSharp,YoloSharp介绍: https://github.com/dme-compunet/YoloSharp 最新版6.0.1,本文…

IDE配置tomcat

1.导航到 Tomcat 安装目录 E:\apache-tomcat-9.0.95-windows-x64\apache-tomcat-9.0.95 2.启动 Tomcat 服务&#xff1a;bin\startup.bat

python读取Oracle库并生成API返回Json格式

一、安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式&#xff1a; 下载地址&#xff1a;https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…

MAC借助终端上传jar包到云服务器

前提&#xff1a;保证工程本地已打包完成&#xff1a;图中路径即为项目的target目录下已准备好的jar包 第一步&#xff1a;打开终端&#xff08;先不要连接自己的服务器&#xff09;&#xff0c;输入下面的上传命令&#xff1a; scp /path/to/local/app.jar username192.168.1…