【leetcode】栈题目总结

 普通栈

先进后出的特点

​​​​​​20. 有效的括号

class Solution {
public:
    unordered_map<char, char> mp = {
        {')', '('},
        {']', '['},
        {'}', '{'}
    };

    bool isValid(string s) {
        stack<char> st;
        for (char c : s) {
            if (c == '(' || c == '[' || c == '{') {
                st.push(c);
            } else {
                if (!st.empty() && mp[c] == st.top()) {
                    st.pop();
                } else {
                    return false;
                }
            }
        }
        return st.empty();
    }
};

155. 最小栈

class MinStack {
private:
    stack<int> xStack; // 存放正常数据
    stack<int> minStack; // 顺序存放元素对应的最小值
public:
    MinStack() {

    }
    
    void push(int val) {
        xStack.push(val);
        if (!minStack.empty()) {
            minStack.push(min(minStack.top(), val));
        } else {
            minStack.push(val);
        }
    }
    
    void pop() {
        xStack.pop();
        minStack.pop();
    }
    
    int top() {
        return xStack.top();
    }
    
    int getMin() {
        return minStack.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

946. 验证栈序列

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
        stack<int> st;
        for (int i = 0, j = 0; i < pushed.size(); ++i) {
            st.push(pushed[i]);
            while (!st.empty() && st.top() == popped[j]) {
                st.pop();
                ++j;
            }
        }
        return st.empty();
    }
};

394. 字符串解码

class Solution {
public:
    string getDigits(string& s, int& ptr) {
        string res;
        while (isdigit(s[ptr])) {
            res.push_back(s[ptr++]);
        }
        return res;
    }

    string getString(vector<string> &v) {
        string ret;
        for (const auto &s: v) {
            ret += s;
        }
        return ret;
    }

    string decodeString(string s) {
        vector<string> stk;
        int ptr = 0;

        while (ptr < s.size()) {
            char cur = s[ptr];
            if (isdigit(cur)) {
                string digits = getDigits(s, ptr);
                stk.push_back(digits);
            } else if (isalpha(cur) || cur == '[') {
                stk.push_back(string(1, cur));
                ptr++;
            } else {
                ptr++;
                vector<string> sub;
                while (stk.back() != "[") {
                    sub.push_back(stk.back());
                    stk.pop_back();
                }
                stk.pop_back();
                int repTIme = stoi(stk.back());
                stk.pop_back();

                string subStr;
                while (!sub.empty()) {
                    subStr += sub.back();
                    sub.pop_back();
                }

                string tmp;
                while (repTIme--) {
                    tmp += subStr;
                }
                stk.push_back(tmp);
            }
        }
        return getString(stk);
    }
};

单调栈

单调栈用途不太广泛,只处理一类典型的问题,比如「下一个更大元素」,「上一个更小元素」等。

739. 每日温度

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        // 单调递减栈,即从底到顶逐渐递减
        stack<int> st;
        vector<int> res(temperatures.size());

        for (int i = 0; i< temperatures.size(); ++i) {
            while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                int preIndex = st.top();
                res[preIndex] = i - preIndex;
                st.pop();
            }
            st.push(i);
        }
        return res;
    }
};

496. 下一个更大元素 I

双数组

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        unordered_map<int, int> mp;
        vector<int> res;

        for (int i = 0; i <  nums2.size(); ++i) {
            while (!st.empty() && nums2[i] > st.top()) {
                int preVal = st.top();
                st.pop();
                mp[preVal] = nums2[i];
            }
            st.push(nums2[i]);
        }

        for (auto num : nums1) {
            if (mp.find(num) != mp.end()) {
                res.push_back(mp[num]);
            } else {
                res.push_back(-1);
            }
        }
        return res;
    }
};

503. 下一个更大元素 II

循环数组

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int len = nums.size();
        
        stack<int> st;
        vector<int> res(len, -1);

        
        for (int i = 0; i <  2 * len; ++i) {
            int index = i % len;
            while (!st.empty() && nums[index] > nums[st.top()]) {
                int preIndex= st.top();
                st.pop();
                res[preIndex] = nums[index];
            }
            st.push(index);
        }

        return res;
    }
};

84. 柱状图中最大的矩形

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        stack<int> st;

        // 假设 h=heights[i]是矩形的高度,那么矩形的宽度最大是多少?我们需要知道:
        // 1. 在 i 左侧的小于 h 的最近元素的下标 left
        // 2. 在 i 右侧的小于 h 的最近元素的下标 right
        vector<int> left(n, 0), right(n, n);

        for (int i = 0; i < n; ++i) {
            while (!st.empty() && heights[i] < heights[st.top()]) {
                int index = st.top();
                st.pop();
                right[index] = i;
            }
            left[i] = st.empty() ? -1 : st.top();
            st.push(i);
        }

        int res = 0;
        for (int i = 0; i < n; ++i) {
            int height = heights[i];
            int wide = right[i] - left[i] - 1;
            res = max(res, height * wide);
        }
        return res;
    }
};

42. 接雨水

单调栈解法:

【Leetcode每日打卡】接雨水问题的超完全手册 - 知乎 (zhihu.com)

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int res = 0;

        for (int i = 0; i < height.size(); ++i) {
            while (!st.empty() && height[i] > height[st.top()]) {
                int bottomIndex = st.top();
                st.pop();
                while (!st.empty() && height[bottomIndex] == height[st.top()]) {
                    st.pop();
                }

                if (!st.empty()) {
                    int heightDiff = min(height[st.top()], height[i]) - height[bottomIndex];
                    int wide = i - st.top() - 1;
                    res += heightDiff * wide;
                }
                
            }
            st.push(i);
        }
        return res;
    }
};

动态规划解法:找到第i个元素左右最大的值得较小值,减去当前高度,即为该列能存储的雨水

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        int sum = 0;

        vector<int> left_h(height.size());
        vector<int> right_h(height.size());

        for (int i = 1; i < len; ++i) {
            left_h[i] = max(left_h[i-1], height[i-1]);
        }

        for (int j = len - 2; j >= 0; --j) {
            right_h[j] = max(right_h[j+1], height[j+1]);
        }

        for (int i = 1; i < len - 1; ++i) {
            int min_h = min(left_h[i], right_h[i]);
            if (min_h > height[i]) {
                sum += min_h - height[i];
            }
        }
        return sum;
    }
};

双指针解法:

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        int sum = 0;
        int left = 0, right = len - 1;
        int left_max = 0, right_max = 0;

        while (left < right) {
            if (height[left] < height[right]) {
                if (left_max <= height[left]) {
                    left_max = height[left];
                } else {
                    sum += left_max - height[left];
                }
                ++left;
            } else {
                if (right_max <= height[right]) {
                    right_max = height[right];
                } else {
                    sum += right_max - height[right];
                }
                --right;
            }
        }
        return sum;
    }
};

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

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

相关文章

【机器学习-21】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

【C++】学习笔记——vector_3

文章目录 七、vector3. vector的模拟实现4. vector实现代码整合 未完待续 七、vector 3. vector的模拟实现 上篇文章我们讲解了非常 玄幻 的拷贝构造函数&#xff0c;同样的方法&#xff0c;我们也能用这种方法来实现 赋值重载函数 。 void swap(vector<T>& v) {s…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来&#xff0c;形成一个相互通信和共享资源的系统。 &#xff08;1&#xff09; 独立模式 独立模式 &#xff1a; 计算机之间相互独立。 &#xff08;2&#xff09;…

C语言二分查找的区间问题

概念 什么是二分查找呢&#xff1f; 二分查找&#xff1a;在有序数组中查找某一特定元素的搜索算法。 二分查找又称折半查找&#xff0c;通过将数组折半&#xff0c;用中间值和查找值作比较&#xff0c;多次使用&#xff0c;直到找到要查找的值。 注意:二分查找的前提是&#…

【xxl-job | 第二篇】Windows源码安装xxl-job

文章目录 2.Windows源码安装xxl-Job2.1拉取源码2.2IDEA导入2.3初始数据库数据2.4修改properties配置2.5启动admin并进入任务管理后台2.6jar包运行&#xff08;部署到Linux服务器上&#xff09;2.6.1打包2.6.2在xxl-job-admin打开jar包目录2.6.3cmd运行jar包 2.Windows源码安装x…

贪心,蓝桥杯真题 [巧克力]

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 2.巧克力 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 做法&#xff1a;我们将巧克力按照价格升序排序&#xff0c;然后顺序枚举巧克力wi&#xff0c;查找小于等于bi的日期中最大的未被选择日期&…

代码审计之浅谈RASP技术

前言&#xff1a; 想摆会烂&#xff0c;所以就落个笔吧。 其实本来是想写关于iast技术的&#xff0c;但是认真思考了下&#xff0c;感觉笔者自己本身也不太能讲清楚iast技术&#xff0c;怕误人子弟。 所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章&#xf…

使用memcache 和 redis 、 实现session 会话复制和保持

一、NoSQL介绍 NoSQL是对Not Only SQL、非传统关系型数据库的统称 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇再次提出指非关系型、分布式、不提供ACID的数据库设计模式 随着互联网时代的数据爆发时增长、数据库技术发展的日新月异&#xff0c;要适应新的业务需求&am…

【网络通信】Windows搭建RTMP视频流服务器(含推流/拉流详细教程)

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;是一种用于实时流媒体传输的网络协议&#xff0c;主要用于传输音频、视频和数据。RTMP最初是由Adobe Systems公司开发的&#xff0c;用于其Flash平台和Adobe Media Server&#xff0c;但随着技术的发展和开源社区的推…

数据结构学习/复习6---双向链表的实现/随机指针链表练习/顺序表与链表对比/存储体系简述

一、链表的结构*8 二、带头双向循环链表的实现 注意事项1&#xff1a;是否需要断言于实际情况中传来的指针是否可以为空&#xff0c;不可以则要断言 三、链表、指针、拷贝经典练习题 四、顺序表与链表总结对比

通过helm在k8s上安装minio

1 helm安装minio 1.1 下载minio 添加仓库 helm repo add bitnami https://charts.bitnami.com/bitnami 将minio拉取下来 helm pull bitnami/minio --version 版本号 解压到本地开始编辑配置文件 tar -zxf minio-xxx.tgz [rootk8s-master01 minio]# vi values.yaml 1.2…

【C语言】简单有趣的扫雷游戏

**©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 一、分析游戏规则二、分文件三、菜单实现四、游戏内容核心实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷5.game()函数实现调用 五、全部源码 一、分…

二维泊松方程(Neumann+Direchliet边界条件)有限元Matlab编程求解|程序源码+说明文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

MySQL索引及优化

MySQL索引及优化 一、MySQL索引1、什么是索引&#xff1f;2、了解过索引的数据结构吗&#xff1f;B树和B树的区别&#xff1f;&#xff08;底层原理&#xff09;3、什么是聚簇索引&#xff08;聚集索引&#xff09;&#xff1f;什么是非聚簇索引&#xff08;二级索引&#xff0…

给Ollama套个WebUI,方便使用

Ollama 基本的安装使用参考前文 https://xugaoxiang.com/2024/05/01/ollama-offline-deploy/&#xff0c;前文使用的模型是 llama2&#xff0c;本篇将使用 llama3&#xff0c;因此在启动时&#xff0c;命令是 ollama run llama3。 Ollama Llama3 Llama3 是 Meta 发布的大语言模…

【AI工具声音克隆】——OpenVoice一键部署modelScope一键使用

一、声音/音色克隆简介 声音或音色克隆的原理实现步骤主要基于深度学习技术&#xff0c;特别是语音合成和生成模型。以下是声音/音色克隆的大致实现步骤&#xff1a; 数据收集&#xff1a; 收集语音数据&#xff0c;作为模型的训练样本。数据应尽可能多样化&#xff0c;包括不…

GRU模块:nn.GRU层的输出state与output

在 GRU&#xff08;Gated Recurrent Unit&#xff09;中&#xff0c;output 和 state 都是由 GRU 层的循环计算产生的&#xff0c;它们之间有直接的关系。state 实际上是 output 中最后一个时间步的隐藏状态。 GRU 的基本公式 GRU 的核心计算包括更新门&#xff08;update gat…

[C++基础学习-04]----C++数组详解

前言 在C中&#xff0c;数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式&#xff0c;它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组&#xff0c;可以看作是一堆一维数组堆叠在一起形成的矩阵。 正文 01-数组简介 一维数组和二维…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验&#xff0c;项目团队开发了这套适用于中小型企业的系统&#xff0c;以帮助那些有特定需求的用户。…

计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7以上版本 可选框架&#xff1a;ssmspringboot都有的 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以 开发工具 Ec…