hot100 -- 栈

目录

🚩有效的括号

🌼最小栈

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.mfbz.cn/a/701808.html

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

相关文章

[初阶数据结构] 包装类 | 泛型

目录 一. 包装类 1.1 什么是包装类? 1.2 包装类的意义 1.3 基本数据类型与包装类 1.4 装箱 1.5 拆箱 1.6 小总结 二. 泛型 2.1 什么是泛型? 2.2 泛型的意义 2.3 泛型的语法 2.4 泛型的编译 2.4.1 下载插件 2.4.2 分析 2.5 上界 2.6 泛型方法 2.7 小总结 三. 总结 一.…

conda虚拟环境,安装pytorch cuda cudnn版本一致,最简单方式

1、pytorch版本安装&#xff08;卸载也会有问题&#xff09; &#xff08;1&#xff09;版本如何选择参考和卸载 https://zhuanlan.zhihu.com/p/401931724 &#xff08;2&#xff09;对应版本如何安装命令 https://pytorch.org/get-started/previous-versions/ 最简答安装参考…

递推算法及相关问题详解

目录 递推的概念 训练&#xff1a;斐波那契数列 解析 参考代码 训练&#xff1a;上台阶 参考代码 训练&#xff1a;信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析&#xff0c;找到问题相邻项之间的关系&#xff08;递推式&a…

实验滤膜等分切割器八等分90mm

名称:滤膜切分器 型号: RNKF-90 适用范围:切分φ90mm玻璃纤维滤膜、石英纤维滤膜 等分数:2等分、4等分、8等分 使用方法: 1、开盖:逆时针旋转防尘盖&#xff0c;与切分台分开后&#xff0c;轻放于台面。 2、放膜:持专用镊子,镊子的长尖在下,短尖在上,取待切分滤膜1片,采样…

配置响应拦截器,全局前置导航守卫

1&#xff1a;配置响应拦截器 响应拦截器&#xff0c;统一处理接口的错误 问题&#xff1a;每次请求&#xff0c;都会有可能会错误&#xff0c;就都需要错误提示 说明&#xff1a;响应拦截器是咱们拿到数据的 第一个 数据流转站&#xff0c;可以在里面统一处理错误。 // 添…

uniapp小程序计算地图计算距离

我们拿到自身和目标距离经纬度 调用此方法即可计算出自身与目标的距离 最后我所展示的页面如下 具体效果可能会有点偏差 要求严格的可以在精细的计算一下

ant组件库日期选择器汉化

ant组件库日期选择器默认英文 如何汉化 跟着官网走不能完全实现汉化。 这里提供一个解决方案&#xff0c;首先&#xff0c;通过pnpm下载moment包。 然后引入和注册文件&#xff1a; import zhCN from ant-design-vue/es/locale/zh_CN;import moment from moment;moment.loca…

vue30:v-model语法糖的本质

在Vue.js框架中&#xff0c;v-model 是一个指令&#xff0c;用于在表单输入和应用状态之间创建双向数据绑定。它本质上是语法糖&#xff0c;意味着它提供了一种更简洁的方式来编写代码&#xff0c;而不需要显式地编写额外的代码。 具体来说&#xff0c;v-model 背后实际上是由…

外汇天眼:Equals集团发布战略评估通知:MDP不再考虑收购提议

Equals Group plc (LON)今天发布了一份关于其战略评估的通知。 Equals公司不再与Madison Dearborn Partners, LLC (MDP)就公司的收购提议进行讨论。MDP因此发布了一份声明&#xff0c;确认其不打算为公司提出收购提议。 然而&#xff0c;MDP与其投资组合公司MoneyGram Interna…

台式电脑怎么连WiFi?4个宝藏方法收藏好!

“我有一部台式电脑&#xff0c;现在不知道应该怎么操作才能让电脑正确连接WiFi&#xff0c;不知道大家有什么简单的连接方法吗&#xff1f;希望可以给我出出主意。” 随着无线网络的普及和科技的飞速发展&#xff0c;越来越多人选择使用WiFi来连接互联网。对于笔记本电脑和移动…

计算机网络(3) 字节顺序:网络字节序与IPv4

一.小端与大端 小端&#xff08;Little endian&#xff09;&#xff1a;低字节保存在内存低地址&#xff0c;高字节保存在内存高地址。 大端&#xff08;Big endian&#xff09;&#xff1a;低字节保存在内存高地址&#xff0c;高字节保存在内存低地址。 例如&#xff08;14…

Android 中USB-HID协议实现

前言 所有通过USB连接android设备进行通讯的步骤都是大同小异&#xff1a;查询usb设备列表 ——>匹配对应的设备类型&#xff08;如productid , vendorId&#xff09;等——>连接usb设备&#xff0c;找到连接通讯的节点——>配置通讯信息&#xff0c;进行通讯。以上是…

Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;ArrayList是Java中最常用的动态数组实现之一&#xff0c;它提供了便捷的操作接口和灵活的扩展能力&#xff0c;使得在处理动态数据集合时非常方便。本文将深入探讨Java中ArrayList的实现原理、常用操作以及一些使用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨…

鸿蒙开发:通过startAbilityByType拉起垂类应用

通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…

Linux网络编程(二)Socket编程

Socket编程 一、网络套接字概念&#xff1a;socket 一个文件描述符指向一个套接字&#xff08;该套接字内部由内核借助两个缓冲区实现。&#xff09;在通信过程中&#xff0c; 套接字一定是成对出现的。二、网络字节序和主机字节序的转换函数&#xff08;ip和端口&#xff09…

代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接&#xff1a;530.二叉搜索树的最小绝对差 文档讲解&#xff1a;代码随想录 状态&#xff1a;还可以 思路&#xff1a;使用中序遍历来遍历二叉搜索树。在中序遍历过程中&#xff0c;比较当前节点和前驱节点的值&#xff0c;更新最小差值。返…

中国四大高原矢量示意图分享

我们在《中国地势三级阶梯示意图分享》一文中&#xff0c;为你分享了中国三级阶梯示意图的矢量文件。 现在&#xff0c;我们再为你分享中国四大高原的矢量示意图文件&#xff0c;你可以在文末查看文件的领取方法。 我国四大高原是如何划分的&#xff1f; 中国四大高原分别为…

你觉得前端开发人员有必要学习Rust吗?

有必要&#xff0c;为什么&#xff1f; 1. 性能优势 Rust能编译成高效的机器码&#xff0c;这对于需要高性能处理的前端项目尤其有利。例如&#xff0c;处理复杂的数据计算或图像处理时&#xff0c;Rust可以提供接近于C/C的性能&#xff0c;同时避免诸如内存泄漏或缓冲区溢出…

2024中国网络安全产品用户调查报告(发布版)

自2020年始&#xff0c;人类进入了21世纪的第二个十年&#xff0c;全球进入了百年未有之大变局&#xff0c;新十年的开始即被新冠疫情逆转了全球化发展的历程&#xff0c;而至2022年3月俄乌战争又突然爆发&#xff0c;紧接着2023年7月“巴以冲突"皱起&#xff0c;世界快速…

LabVIEW进行负载测试

本文介绍了如何使用LabVIEW进行负载测试&#xff0c;通过一个具体案例详细讲解了测试系统的组成、工作原理和实现方法。系统采用先进的硬件和软件架构&#xff0c;结合LabVIEW的强大功能&#xff0c;成功实现了对设备的高效负载测试&#xff0c;确保了系统的可靠性和性能。 项…