hot100 -- 栈

news2024/9/20 6:12:33

目录

🚩有效的括号

🌼最小栈

AC  栈

AC  链表

🌼字符串解码

🐻每日温度

🍒柱状图中的最大矩形

解释

AC  单调栈


🚩有效的括号

20. 有效的括号 - 力扣(LeetCode)

1,数据结构--栈

2,题目 “左括号必须以正确顺序闭合” -- 即,按栈的顺序,每一个新出现的右括号,必须被栈中相邻的左括号抵消掉

3,注意最后的 非空 检测

class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2)
            return false; // 奇数不匹配

        unordered_map<char, char> m{
            {'}','{'}, {')','('}, {']','['}
        }; // 哈希:初始化构造

        stack<char> st;
        for (auto c : s) {
            // 匹配到右括号
            if (m.count(c)) {
                if (!st.empty() && st.top() == m[c])   
                    st.pop(); // 左右抵消
                else
                    return false;
            }
            else 
                st.push(c);
        }
        if (!st.empty())
            return false;
        return true;
    }
};

🌼最小栈

155. 最小栈 - 力扣(LeetCode)

AC  栈

二元组 pair,用 second 维护最小值(注意声明方式 stack< pair<int, int> >

push 时,second 取 getMin() 和 val 的较小值

getMin() 取 INT_MAX 或 st.top().second(当前最小值)

class MinStack {
private:
    stack< pair<int, int> > st;
public:
    MinStack() {
        
    }
    
    void push(int val) {
        st.push({val, min(val, getMin())});
    }
    
    void pop() {
        st.pop();
    }
    
    int top() {
        return st.top().first;
    }
    
    int getMin() {
        return st.empty() ? INT_MAX : st.top().second;
    }
};

AC  链表

链表模拟栈

思路类似 栈--二元组,Node 类里维护 val, Min, *next 三个变量

Node 如果是 class,要加 public,要不就用 struct

class Node {
public:
    int val;
    int Min; // 当前链表最小值
    Node* next;
    Node(int x, int y) : val(x), Min(y), next(NULL) {}
    Node(int x, int y, Node* now) : val(x), Min(y), next(now) {} // 初始化构造
};

class MinStack {
private:
    Node* head; // 头指针
public:
    MinStack() {
        head = NULL; // 初始化为空
    }
    
    void push(int val) {
        if (head == NULL)
            head = new Node(val, val);
        else // 更新链表头节点 && 头节点的最小值
            head = new Node(val, min(val, head->Min), head);
    }
    
    void pop() {
        head = head->next;
    }
    
    int top() {
        return head->val;
    }
    
    int getMin() {
        return head->Min;
    }
};

🌼字符串解码

394. 字符串解码 - 力扣(LeetCode)

1,关键:'[' 左边一定是数字

2,思路:比如 abc3[r],那么 x = "abc",num = 3,所以字符串 = x + num * 'r'

3,坑:代码第 16 行

else if (c >= '0' && c <= '9')
// 而不是 c >= '1',会跳过 100 里面的 0

4,括号嵌套的处理(可以用 abc3[w3[e]2[q]] 模拟下 )(边模拟,边敲代码)

遇到左括号--压栈;遇到右括号--出栈

时间 O(S) :S 为解码后字符串长度

class Solution {
public:
    string decodeString(string s) {
        stack< pair<string,int> > st;
        string x = ""; // 左括号前的字符串
        int num = 0; // 左括号左边的数字

        for (auto c : s) {
            if (c == '[') { // 遇到左括号,将左括号前的字母和数字压 入栈
                st.push({x, num});
                x = "";
                num = 0;
            }
            else if (c >= 'a' && c <= 'z')
                x += c; // 字符串
            else if (c >= '0' && c <= '9')
                num = num * 10 + (c - '0'); // 数字
            else if (c == ']') { // 右括号,将右括号前的字母和数字 出栈
                string s1 = st.top().first;
                int n1 = st.top().second;
                st.pop();
                while (n1--)
                    s1 += x; // 字符串 + 数字 * 括号内字符串
                x = s1; // 赋值给当前字符串
                num = 0;
            }
        }
        return x; 
    }
};

🐻每日温度

739. 每日温度 - 力扣(LeetCode)

本题思路:单调栈(栈中元素单调递减 或 递增,不符合时用 while {... pop} 掉) 

单调栈 - OI Wiki (oi-wiki.org)

1,栈存的是下标

2,如果遇到当前温度 > 栈顶温度,下标差就是栈顶那一天的天数差 day

3,坑,第 8 行,要用 while,否则会出现栈底积压了大量下标,但是数组已经遍历完的情况 

while (!st.empty() && temperatures[i] > temperatures[st.top()] ) {

O(n):每个元素入栈出栈 1 次

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        stack<int> st; // 下标
        vector<int> ans(n, 0); // 初始化为 0
        for (int i = 0; i < n; ++i) {
            while (!st.empty() && temperatures[i] > temperatures[st.top()] ) {
                int day = i - st.top(); // 当前下标 - 栈顶下标 = 天数差
                ans[st.top()] = day;
                st.pop();
            }
            st.push(i); // 下标入栈
        }
        return ans;
    }
};

🍒柱状图中的最大矩形

84. 柱状图中最大的矩形 - 力扣(LeetCode)

解释

用单调栈解决👇

单调栈 - OI Wiki (oi-wiki.org)

1,stack 存的是索引,但是比较的是高度(单调递增栈的递增,是针对高度而言)

对应高度可以根据索引得到

2,递增不用理会,直到遇到递减的

需要对宽度分类讨论,如果栈为空,说明前面没有更短的,清空完更长的模板就没了

👇结合图理解 

可以锯掉当前突出这块,也就是 pop() 掉,因为后面用不上了,宽度可以通过 索引 i 和 st.top() 计算得出,高度即当前栈顶木板 heights[st.top()]

注意顺序:先取高度,接着 pop(),最后对宽度分类讨论,然后更新 ans

AC  单调栈

时间 O(n):每个元素只会出栈 1 次,不会出现每个 for 都需要出栈 n 次的情况,for 和 while 独立

所以时间线性

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st; // stack 存的是索引, 高度可以根据索引得到
        heights.push_back(0); // 最后加个高度 0, 避免最后一直递增
        int n = heights.size();
        int ans = 0; // 最大矩形面积

        for (int i = 0; i < n; ++i) {
            while (!st.empty() && heights[i] < heights[st.top()]) {
                int h = heights[st.top()];
                st.pop();
                int wid;
                if (st.empty()) // 栈为空, 左边只有 > 当前高度的, 已全部清空
                    wid = i;
                else
                    wid = i - st.top() - 1;
                ans = max(ans, h * wid);
            }
            st.push(i); // 插入索引
        }
        return ans;

    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seal^_^【送书活动第6期】——《Docker快速入门》

Seal^_^【送书活动第6期】——《Docker快速入门》 一、参与方式二、本期推荐图书2.1 作者荐语2.2 编辑推荐2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 从Docker Desktop入手&#xff0c;快速掌握容器技术&#xff01;&#xff01;&#xff01;&#xff01; 一、参与方式 1、…

HALCON-从入门到入门-阈值分割定位算子综合运用

1.废话 之前我的一个师兄告诉我&#xff0c;针对图像上想要定位的内容&#xff0c;机器视觉中定位的方式有很多种&#xff0c;但是如果用阈值分割定位可以做的&#xff0c;就不要用模板匹配了。因为基于形状的模板匹配始终会存在匹配不到的风险&#xff0c;那如果打光效果可以…

VS2022使用C语言代码访问MariaDB数据库

第一步,先安装数据库服务器,如果你不想安装这个服务器,请看结尾: 第二步,建立数据库 第三步,配置VS2022 第四步,写代码 ,这里其实使用的是MariaDB 的C语言 API #include <stdio.h> #include <window

python添加两组实验显著性

Python-statannotations库添加显著性标注&#xff1a; 1、官网资料&#xff1a;https://github.com/trevismd/statannotations 官网例子&#xff1a; import seaborn as snsfrom statannotations.Annotator import Annotatordf sns.load_dataset("tips") x "…

使用 C# 学习面向对象编程:第 7 部分

多态性 我们在程序中使用多态的频率是多少&#xff1f;多态是面向对象编程语言的第三大支柱&#xff0c;我们几乎每天都在使用它&#xff0c;却不去想它。 这是一个非常简单的图表&#xff0c;它将解释多态性本身。 简单来说&#xff0c;我们可以说&#xff0c;只要我们重载类…

机器学习模型评价、模型与算法选择(综述)

摘要&#xff1a;本文主要讨论了模型评估、模型选择和算法选择的重要性&#xff0c;并回顾了解决这些任务的不同技术。文章强调了在小数据集上不推荐使用留出方法&#xff0c;而应使用bootstrap技术来评估性能的不确定性。在讨论偏差-方差权衡时&#xff0c;文章比较了leave-on…

【紧急警示】Locked勒索病毒利用最新PHP远程代码执行漏洞大规模批量勒索!文末附详细加固方案

1. Locked勒索病毒介绍 locked勒索病毒属于TellYouThePass勒索病毒家族的变种&#xff0c;其家族最早于2019年3月出现&#xff0c;擅长利用高危漏洞被披露后的短时间内&#xff0c;利用1Day对暴露于网络上并存在有漏洞未修复的机器发起攻击。该家族在2023年下半年开始&#xf…

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

盐酸酸洗废水合理的处理手段

盐酸酸洗废水处理是工业生产中一项重要的环保措施&#xff0c;特别是在钢铁、金属加工等行业中&#xff0c;酸洗废水因其高酸性和高金属离子含量而需要得到妥善处理。以下是对盐酸酸洗废水处理的详细分析和讨论。 一、盐酸酸洗废水的特性 盐酸酸洗废水主要来源于钢材的酸洗线&a…

一文读懂CRM系统到底怎么选?

CRM系统&#xff08;即客户关系管理系统&#xff09;能够帮助企业有效管理客户关系、提升客户满意度、增加销售机会以及优化业务流程。然而&#xff0c;面对市场上众多的CRM供应商&#xff0c;企业如何选择最适合自身需求的CRM软件显得尤为重要。 选择不当的CRM系统可能导致一系…

WordPress——Argon主题美化

文章目录 Argon主题美化插件类类别标签页面更新管理器文章头图URL查询监视器WordPress提供Markdown语法评论区头像设置发信设置隐藏登陆备份设置缓存插件 主题文件编辑器页脚显示在线人数备案信息(包含备案信息网站运行时间)banner下方小箭头滚动效果站点功能概览下方Links功能…

AI大模型的战场:通用与垂直的较量

AI大模型的战场&#xff1a;通用与垂直的较量 引言&#xff1a;AI界的“通才”与“专家” 在AI的大千世界里&#xff0c;有这样两类模型&#xff1a;一类是像瑞士军刀一样多功能的通用大模型&#xff0c;另一类则是像手术刀一样精准的垂直大模型。它们在AI战场上展开了一场激…

【Ardiuno】实验使用ESP32单片机实现高级web服务器暂时动态图表功能(图文)

接下来&#xff0c;我们继续实验示例代码中的Wifi“高级web服务器”&#xff0c;配置相关的无线密码后&#xff0c;开始实验 #include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include <ESPmDNS.h>const char *ssid "XIAOFE…

docker-compose启动oracle11、并使用navicat进行连接

一、docker-compose.yml version: 3.9 services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11grestart: alwaysprivileged: truecontainer_name: oracle11gvolumes:- ./data:/u01/app/oracleports:- 1521:1521network_mode: "host"logging:d…

[数据集][目标检测]胸部解剖检测数据集VOC+YOLO格式100张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;100 标注数量(xml文件个数)&#xff1a;100 标注数量(txt文件个数)&#xff1a;100 标注类别…

代理IP的稳定性与安全性应如何保障?

在数字化时代&#xff0c;代理IP作为访问网络的重要工具&#xff0c;其稳定性和安全性对于保障网络使用体验和隐私保护具有至关重要的意义。今天IPIDEA就为大家分享保障代理IP的稳定性与安全性的几个关键点。 一、选择可靠的代理服务提供商 确保代理IP稳定性的关键是选择一家可…

【工具】拉取或者review github上别人提的未合入开源项目的PR代码

一、pr id 链接后加.patch 举个例子说下吧。 比如我们有下面的PR链接&#xff1a; https://github.com/apache/hadoop/pull/6871/files 其界面如下所示&#xff1a; 我们只需要把URL改成&#xff1a; https://github.com/apache/hadoop/pull/6871.patch 它就会自动跳转后变…

解决el-table表格拖拽后,只改变了数据,表头没变的问题

先看看是不是你想要解决的问题 拖拽后表头不变的bug修复 这个问题一般是使用v-for对column的数据进行循环的时候&#xff0c;key值绑定的是个index导致的&#xff0c;请看我上篇文章&#xff1a;eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽)&#xff1a;-…

html和css创建一个简单的网页

html代码及解析 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS Example</title><lin…

基于模型的理念:认知提升与研发模式转型

系统工程是从航空、航天等系统的开发过程中总结出来、用于指导复杂工程项目开展的方法论&#xff0c;是协调庞大团队完成复杂任务的技术和管理要素的综合&#xff0c;最新的国际标准将系统工程定义为“管控整个技术和管理活动的跨学科的方法&#xff0c;这些活动将一组客户的需…