当前位置: 首页 > news >正文

[算法]单调栈解法

目录

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

42. 接雨水 - 力扣(LeetCode)

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


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

解法:

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了

1.在本题中,其实就是,找到一个元素右边比自己大的第一个元素,就要想到用单调栈了。

2.单调栈的原理就是,用栈来保存我们遍历过的元素,不至于我们在遍历时忘记我们之前遍历过的较小的元素,当我们找到较大的元素时,我们就可以从栈口从小到大的找回之前小于它的元素(多一个栈的空间,可以让时间复杂度降到O(n))。

代码:

class Solution 
{
public:vector<int> dailyTemperatures(vector<int>& temperatures){//单调栈stack<int> st;st.push(0);vector<int> ret(temperatures.size(), 0);for (int i = 1; i < temperatures.size(); i++){//遍历元素小于栈口元素的(下标入栈)if (temperatures[i] <= temperatures[st.top()]){st.push(i);}else//大于栈口元素{//栈里找小于遍历元素的while (!st.empty() && temperatures[i] > temperatures[st.top()]){int tmp = st.top();st.pop();ret[tmp] = i - tmp;}//遍历元素入栈st.push(i);}}return ret;}
};

42. 接雨水 - 力扣(LeetCode)

解法:

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。

1.本题目中,其实就是要找到一个元素右边第一个比自己大的元素,再和自己上一个元素组成凹槽,计算凹槽大小。

2.单调递增栈

class Solution
{
public:int trap(vector<int>& nums){//单调栈-递增栈stack<int> st;st.push(0);int ret = 0;for (int i = 1; i < nums.size();i++){if (nums[i] <= nums[st.top()]) st.push(i);//遍历元素小于等于栈口元素入栈else{while (!st.empty() && nums[st.top()] < nums[i]){int mid = st.top();st.pop();//弹出if(!st.empty())//前面弹出的一个有可能是最后一个,所以要探空ret += (min(nums[i], nums[st.top()])-nums[mid]) * (i - st.top()-1);//计算凹槽处的雨水数量}st.push(i);}}return ret;}
};

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

解法:

上面接雨水那题是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。

1.因为是找矩形,较小元素限制了矩形的大小,因此需要找到一个元素两边比自己小的元素,找比自己小的元素就需要用单调递减栈了。

2.遍历元素比栈口大的入栈,当遇到第一个比栈口大的,栈口元素设置为mid,新栈口元素和遍历元素i就是两边比mid小的元素,以nums[i]为基准高h,求矩形大小。

代码:

class Solution {
public:int largestRectangleArea(vector<int>& nums){//单调栈-递减栈stack<int> st;int ret = 0;//首尾加0nums.insert(nums.begin(), 0);nums.insert(nums.end(), 0);st.push(0);st.push(1);for (int i = 1; i < nums.size(); i++){//遍历元素比栈口元素大的入栈if (nums[i] >= nums[st.top()]){st.push(i);}else{while (st.size()>1 && nums[i] < nums[st.top()]){int mid = st.top();//以mid为基准st.pop();int left = st.top();int right = i;int h = nums[mid];int w = right - left - 1;ret = max(h * w, ret);}st.push(i);}}return ret;}
};

相关文章:

[算法]单调栈解法

目录 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 通常是一维数…...

构建数据安全防线:MySQL数据备份策略的文档化实践

在数据驱动的商业环境中&#xff0c;数据备份策略是确保数据安全和业务连续性的关键。MySQL&#xff0c;作为广泛使用的数据库管理系统&#xff0c;其数据备份策略的文档化对于规范备份流程、提高恢复效率和满足合规要求至关重要。本文将深入探讨如何在MySQL中实现数据备份的策…...

4. GIS前端工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...

软件测试-Selenium+python自动化测试

目录 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览器版本号选择。 一、元素定位 对html网页中的元素进行定位,同时进行部分操作。 1.1一个简单的模板 from selenium import webdriver from selenium.webdrive…...

SpringBoot与Minio的极速之旅:解锁文件切片上传新境界

目录 一、前言 二、对象存储&#xff08;Object Storage&#xff09;介绍 &#xff08;1&#xff09;对象存储的特点 &#xff08;2&#xff09;Minio 与对象存储 &#xff08;3&#xff09;对象存储其他存储方式的区别 &#xff08;4&#xff09;对象存储的应用场景 三、…...

Java 7.3 - 分布式 id

分布式 ID 介绍 什么是 ID&#xff1f; ID 就是 数据的唯一标识。 什么是分布式 ID&#xff1f; 分布式 ID 是 分布式系统中的 ID&#xff0c;它不存在于现实生活&#xff0c;只存在于分布式系统中。 分库分表&#xff1a; 一个项目&#xff0c;在上线初期使用的是单机 My…...

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库&#xff0c;以其高性能的键值对存储和多种应用场景而闻名。本…...

基于单片机的自动浇花控制写设计任务书

一、内容要求&#xff1a; 任务 随着社会的进步&#xff0c;人们的生活质量越来越高。在家里养养盆花可以陶冶情操&#xff0c;丰富生活。同时盆花可以通过光合作用吸收二氧化碳&#xff0c;净化室内空气&#xff0c;在有花木的地方空气中阴离子聚集较多&#xff0c;所以空气…...

从零到精通:用C++ STL string优化代码

目录 1:为什么要学习string类 2:标准库中的string类 2.1:string类(了解) 2.2:总结 3:string类的常用接口 3.1:string类对象的常见构造 3.1.1:代码1 3.1.2:代码2 3.2:string类对象的遍历操作 3.2.1:代码1(begin end) 3.2.2:代码2(rbegin rend) 3.3:string类对象的…...

鸿蒙轻内核M核源码分析系列五 时间管理

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析上一篇文章中&#xff0c;我们剖析了中断的源码&#xff0c;简单提到了Tick中断。本文会继续分析Tick和时间相关的源…...

Python Opencv鼠标回调

使用 OpenCV 的 cv2.setMouseCallback() 方法来捕捉鼠标事件&#xff0c;并实现以下功能&#xff1a; 实时在鼠标指针附近显示其位置的像素坐标。通过左键双击&#xff0c;将像素坐标记录到数组中。通过右键点击&#xff0c;取消上一次添加的坐标。 下面是实现代码的示例&…...

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x&#xff1a;…...

Android系统去掉WIFI模块

先说应用场景&#xff0c;有些特定设备&#xff0c;不能连接wifi。需要隐藏的模块&#xff0c;QS面板模块的wifi,还有设置里面的wifi.由于QS属于SystemUI&#xff0c;熟悉SystemUI之后&#xff0c;就可以直接去SystemUi那里找&#xff0c;找到QSTitle 默认配置的地方。 一、…...

代码随想录 -- 二叉树 -- 翻转二叉树

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 递归比较简单 class Solution(object):def invertTree(self, root):if rootNone:returnnode rootif node.left or node.right:tempnode.leftnode.leftnode.rightnode.righttempself.invertTree(node.left)self.inve…...

Node.js之文件复制

1.方式一&#xff1a;readFile // 导入fs模块 const fs require("fs") // 导入process模块 const process require("process")// 读取文件内容 let data fs.writeFileSync(./test.txt) // 写入文件内容 fs.writeFileSync(./test1.txt, data) 2.方式二&…...

新手c语言讲解及题目分享(十六)--文件系统专项练习

在我刚开始学习c语言的时候就跳过了这一章节&#xff0c;但在后面慢慢发现这一章节还是比较重要的,如果你报考了计算机二级c语言的话&#xff0c;你应该可以看到后面的三个大题有时会涉及到这章。所以说这章还是非常重要的。 目录 前言 一.打开文件 1.Fopen( )函数返回值 2&…...

RabbitMQ本地Ubuntu系统环境部署与无公网IP远程连接服务端实战演示

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 安装内网穿透工具3.1 安装cpolar内网穿透3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&am…...

[C++#28][多态] 两个条件 | 虚函数表 | 抽象类 | override 和 final | 重载 重写 重定义

目录 0.引入 1.虚函数 1. 虚函数的重写/覆盖 2. 特例1&#xff1a;不加 virtual 关键字的重写 3. 特例2&#xff1a;协变&#xff08;了解&#xff09; 2.多态的构成和细节 1. C11 的 override 和 final 1. final 不可重写 2. override 报错检查 ⭕2. 重载、覆盖&…...

List 集合指定值升序降序排列Comparator实现

升序排序 升序排序通常是指从小到大的排序。对于数值类型来说&#xff0c;可以直接使用 compareTo 方法&#xff0c;而对于其他类型&#xff0c;可以根据实际需求实现比较逻辑。 示例代码 import java.util.Comparator; import java.util.List; import java.util.ArrayList;cl…...

【Day07】

目录 MySQL-DQL- 基本查询 MySQL-DQL- 条件查询 MySQL-DQL- 聚合函数 MySQL-DQL- 分组查询 MySQL-DQL- 排序查询 MySQL-DQL- 分页查询 MySQL-DQL- 案例 MySQL-多表设计-一对多 MySQL-多表设计-一对多-外键约束 MySQL-多表设计-一对一&多对多 MySQL-多表设计-案例…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...