代码随想录算法训练营第62/63天| 503.下一个更大元素II、42. 接雨水、84.柱状图中最大的矩形

文章目录

  • 503.下一个更大元素II
    • 思路
    • 代码
  • 42. 接雨水
    • 思路
    • 代码
  • 84.柱状图中最大的矩形
    • 思路
    • 代码

503.下一个更大元素II

题目链接:503.下一个更大元素II
文章讲解:代码随想录|503.下一个更大元素II

思路

和739. 每日温度 (opens new window)也几乎如出一辙,区别于在遍历的过程中模拟走两边nums

代码

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);if (nums.size() == 0) return result;stack<int> st;st.push(0);for (int i = 1; i < nums.size() * 2; i++) { // 模拟遍历两边nums,注意一下都是用i % nums.size()来操作if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size()); else {while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}}return result;}
};

42. 接雨水

题目链接:42. 接雨水
文章讲解:代码随想录|42. 接雨水

思路

寻找右边第一个比自己大的元素,来计算雨水面积
单调栈是按行计算的
在这里插入图片描述
一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子
在这里插入图片描述
遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中
在这里插入图片描述

代码

class Solution {
public:int trap(vector<int>& height) {int result = 0;stack<int> stk;stk.push(0);int mid, h, w;for(int i = 1; i < height.size(); i++){if(height[i] < height[stk.top()]) stk.push(i);else if(height[i] == height[stk.top()]){stk.pop();stk.push(i);}else{while(!stk.empty() && height[i] > height[stk.top()]){mid = stk.top();stk.pop();if (!stk.empty()) {h = min(height[i], height[stk.top()]) - height[mid];w = i - stk.top() - 1;result += h * w;}}stk.push(i);}}return result;}
};

stk.pop();后要记得判断if (!stk.empty()),因为有时候可能没有左边的柱子

84.柱状图中最大的矩形

题目链接:84.柱状图中最大的矩形
文章讲解:代码随想录|84.柱状图中最大的矩形

思路

  1. 接雨水 (opens new window)是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
    只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

代码

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情况一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情况二st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};

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

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

相关文章

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

CSP-201712-1-最小差值

CSP-201712-1-最小差值 #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int>arr; int main() {int n, minDelta 99999;cin >> n;for (int i 0; i < n; i){int t;cin >> t;arr.push_back(t…

科技企业如何做到FTP数据安全保护

在数字化浪潮的推动下&#xff0c;科技企业的数据已成为推动创新、提升效率、增强竞争力的核心资源。数据的重要性不言而喻&#xff0c;它不仅包含了客户信息、市场分析、产品设计等关键信息&#xff0c;更是企业宝贵的资产。然而&#xff0c;随着数据量的激增&#xff0c;数据…

数据守护者:揭秘文件备份的重要性与实用策略

一、守护数据安全&#xff1a;文件备份的不可或缺性 在数字化时代&#xff0c;我们的工作、学习和生活都围绕着数据展开。无论是珍贵的家庭照片、重要的工作文件&#xff0c;还是个人的创意作品&#xff0c;这些数字资产都承载着我们的回忆、努力和创意。然而&#xff0c;随着…

基于扩散模型的图像编辑:首篇综述

AIGC 大模型最火热的任务之一——基于 Diffusion Model 的图像编辑(editing)领域的首篇综述。长达 26 页&#xff0c;涵盖 297 篇文献&#xff01;本文全面研究图像编辑前沿方法&#xff0c;并根据技术路线精炼地划分为 3 个大类、14 个子类&#xff0c;通过表格列明每个方法的…

十四、Qt主机信息与网络编程

一、主机信息 1、主机信息接口 QHostInfo&#xff1a;获取主机名称和IP地址QNetWorkInterface&#xff1a;获取主机的所有网络接口&#xff0c;包括子网掩码和广播地址等 &#xff08;1&#xff09;使用 项目添加模块QT network2、实现程序 &#xff08;1&#xff0…

Linux系统加固:限制用户对资源的使用禁止IP源路由更改主机解析地址的顺序设置umask值

Linux系统加固&#xff1a;限制用户对资源的使用&禁止IP源路由&更改主机解析地址的顺序&设置umask值 1.1 限制用户对资源的使用1.2 禁止IP源路由1.3 更改主机解析地址的顺序1.4 禁止ip路由转发1.5 设置umask值 &#x1f496;The Begin&#x1f496;点点关注&#x…

虚拟化介绍

虚拟化理论介绍 什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统。 在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual Machine Monitor&#xff0c;V…

浅谈 Linux进程回收、wait、waitpid函数

文章目录 前言进程回收wait 函数进程回收 相关的宏函数介绍waitpid 函数 前言 本文介绍 进程回收 的概念、相关宏函数、wait 函数 以及 waitpid 函数的使用方式。 进程回收 一个进程终止时会关闭所有文件描述符&#xff0c;释放在用户空间分配的内存&#xff0c;但它的 PCB …

RocketMQ安装

mq服务端安装配置启动把windows做成服务 mq管理界面安装配置启动 mq服务端 安装 RocketMQ下载地址 配置 ROCKETMQ_HOME D:\google-d\rocketmq-all-5.2.0-bin-release启动 # bin目录cmd输入 start mqnamesrv.cmd把windows做成服务 http://t.csdnimg.cn/qd2RD mq管理界面 …

CentOS7设置虚拟机语言为中文

1.查看本地安装的语言 locale -a 是一个Linux命令&#xff0c;用于列出系统中可用的所有区域设置&#xff08;locales&#xff09;它包含了各种语言和地区的不同设置。 打开终端&#xff08;右键open terminal&#xff09;输入 locale -a 查看本地安装的语言&#xff1a; 其中z…