【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 的最近元素的下标 rightvector<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.mzph.cn/bicheng/9770.shtml

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

相关文章

between函数为导致索引失效吗?

当BETWEEN函数用于WHERE条件时&#xff0c;索引可能会失效的情况是当被比较的列&#xff08;例如日期或数字列&#xff09;上存在索引&#xff0c;但是BETWEEN的范围涵盖了索引中的大部分数据。这会导致MySQL优化器放弃使用索引而选择全表扫描&#xff0c;因为对于优化器来说&a…

C++关联容器2——map,multimap,set,multiset基本操作

目录 关联容器操作 关联容器迭代器 set 的迭代器是const的 遍历关联容器 关联容器和算法 添加元素 向map添加元素 检测insert的返回值 向multiset或 multimap添加元素 std::multiset 例子 std::multimap 例子 删除元素 std::set 和 std::multiset 示例 std::map 和…

leetcode47-Permutations II

分析 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2], [1,2,1], [2,1,1]] 题目 由于元素是重复的&#xff0c;要求返回不重复的&#xff0c;所以一定会有…

代码随想录算法训练营 总结篇

代码随想录算法训练营 总结篇 历时两个月的算法训练结束了&#xff01;首先恭喜我自己&#xff0c;中间虽然拖拉了几天&#xff0c;但总是补上了&#xff0c;也算是成功完成了训练。 虽然已经大三了&#xff0c;但是没有系统的刷过算法。之前在课上也是老师讲完就完了&#x…

交友软件源码-源码+搭建+售后,上线即可运营聊天交友源码 专业语聊交友app开发+源码搭建-快速上线

交友小程序源码是一种可以帮助开发者快速搭建交友类小程序的代码模板。它通常包括用户注册、登录、个人信息编辑、匹配推荐、好友聊天等常见功能&#xff0c;以及与后台数据交互的接口。使用这种源码可以极大地缩短开发时间&#xff0c;同时也可以根据自己的需求进行二次开发和…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网&#xff1a;访问 Node.js 官网&#xff0c;下载适合你操作系统的安装程序。运行安装程序&#xff1a;下载完成后&#xff0c;双击安装程序并按照提示进行安装。验证安装&#xff1a;安装完成后&#xff0c;在终…

一些有趣的Chrome命令行调用例子

Chrome浏览器支持多种命令行参数&#xff0c;这些参数可以用于定制浏览器行为或进行调试。以下是一些有趣的Chrome命令行调用例子&#xff1a; 以Kiosk模式启动Chrome: google-chrome --kiosk http://www.example.com 启动Chrome并禁用所有插件: google-chrome --disable-plug…

C++基础-编程练习题及答案

文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中&#xff0c; 有这样一种数非常怪&#xff0c; 它们不在第一个&#xff0c; 也不在最后一个&…

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据&#xff1a;是数据库中存储的基本对象&#xff0c;是描述事物的符号记录 数据库&#xff08;DataBase&#xff0c;DB&#xff09;&#xff1a;是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统&#xff08;DataBas…

MySQL环境搭建

MySQL 环境搭建 一、卸载不需要的MySQL环境 #1.关闭服务 systemctl stop mysql #2.查找MySQL安装包&#xff0c;并删除 rpm -qa&#xff1b;xargs yum remove -y 二、获取MySQL官方yum源 http://repo.mysql.com/ 根据系统版本下载对应的文件&#xff1b;然后使用rz将文件传…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数拷贝构造函数浅拷贝深拷贝拷贝构造函数实现 析构函数赋值重载 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 迭代器begin & endrbegin & rend 总结 前言 模拟实现不是为了写得和库里面一样好。而是为…

OmniReader Pro mac激活版:智慧阅读新选择,开启高效学习之旅

在追求知识的道路上&#xff0c;一款优秀的阅读工具是不可或缺的。OmniReader Pro作为智慧阅读的新选择&#xff0c;以其独特的功能和卓越的性能&#xff0c;为您开启高效学习之旅。 OmniReader Pro具备高效的文本识别和处理技术&#xff0c;能够快速准确地提取文档中的关键信息…

《QT实用小工具·五十四》果冻弹出效果的动画按钮

1、概述 源码放在文章末尾 该项目实现动画按钮&#xff0c;鼠标放在按钮上可以弹性拉出的三个按钮&#xff0c;使用贝塞尔曲线实现&#xff0c;项目demo显示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef WATERCIRCLEBUTTON_H #define WATERCIRCLEBUTTON…

Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

最后一块石头重量Ⅱ 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两…

Transformers中加载预训练模型的过程剖析

使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…

【go项目01_学习记录10】

操作数据库 1 插入数据2 显示文章2.1 修改 articlesShowHandler() 函数2.2 代码解析 3 编辑文章3.1 添加路由3.2 编辑articlesEditHandler()3.3 新建 edit 模板3.4 代码重构3.5 完善articlesUpdateHandler()3.6 测试更新3.7 封装表单验证 1 插入数据 . . . func articlesStore…

厚德提问大佬答4:AI绘画生成的心得

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…

什么是async和await?

async 和 await 是 JavaScript&#xff08;特别是 ES2017 及更高版本&#xff09;中用于处理异步操作的关键字。它们使得异步代码看起来、写起来更像同步代码&#xff0c;从而提高了代码的可读性和可维护性。 async async 是一个函数修饰符&#xff0c;用于声明一个函数是异步…

车载电子电器架构 —— 应用软件开发(中)

车载电子电器架构 —— 应用软件开发(中) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…