算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

题目描述: 

解题思路:

要解决这个问题,我们需要找到每个柱子可以扩展的最大左右边界,然后计算以每个柱子为高度的最大矩形面积。

具体步骤如下:

  1. 计算每个柱子左侧最近的比当前柱子矮的位置

    • 使用一个单调栈(栈中保存元素索引)从左到右遍历柱子,确保栈中元素始终保持递增(从栈底到栈顶)。
    • 如果当前柱子的高度小于栈顶柱子的高度,则不断弹出栈顶元素,直到找到一个高度小于当前柱子的元素为止。
    • 这样可以确定每个柱子左边第一个比它矮的位置。
  2. 计算每个柱子右侧最近的比当前柱子矮的位置

    • 使用类似的单调栈方法,从右到左遍历柱子,确保栈中元素始终保持递增。
    • 同样地,可以确定每个柱子右边第一个比它矮的位置。
  3. 计算最大矩形面积

    • 计算每个柱子可以扩展的宽度,使用公式 (right[i] - left[i] - 1) * heights[i] 来计算以该柱子为高度的矩形面积。
    • 遍历所有柱子,找到最大面积。

代码示例: 

class Solution {public int largestRectangleArea(int[] heights) {int n = heights.length;int[] left = new int[n]; // 用于存储每个柱子的左边界int[] right = new int[n]; // 用于存储每个柱子的右边界Stack<Integer> stack = new Stack<>(); // 用于计算左右边界的单调栈// 从左到右遍历柱子,计算每个柱子左边第一个比它矮的位置for (int i = 0; i < n; i++) {// 如果栈不为空且栈顶柱子的高度大于等于当前柱子的高度,弹出栈顶元素while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {stack.pop();}// 如果栈为空,说明当前柱子左侧没有比它矮的柱子if (stack.isEmpty()) {left[i] = -1; // 左边界为-1} else {left[i] = stack.peek(); // 栈顶元素即为左边第一个比当前柱子矮的位置}// 将当前柱子的索引压入栈中stack.push(i);}stack.clear(); // 清空栈,用于计算右边界// 从右到左遍历柱子,计算每个柱子右边第一个比它矮的位置for (int i = n - 1; i >= 0; --i) {// 如果栈不为空且栈顶柱子的高度大于等于当前柱子的高度,弹出栈顶元素while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {stack.pop();}// 如果栈为空,说明当前柱子右侧没有比它矮的柱子if (stack.isEmpty()) {right[i] = n; // 右边界为n} else {right[i] = stack.peek(); // 栈顶元素即为右边第一个比当前柱子矮的位置}// 将当前柱子的索引压入栈中stack.push(i);}int ans = 0; // 用于存储最大矩形面积// 遍历每个柱子,计算以该柱子为高度的最大矩形面积for (int i = 0; i < n; i++) {// 以heights[i]为高度的矩形面积计算公式为:(right[i] - left[i] - 1) * heights[i]ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);}return ans; // 返回最大矩形面积}
}

详细解题步骤:

  1. 初始化数组和栈

    • left[i] 存储柱子 i 左侧第一个比其矮的柱子的索引,如果不存在,设置为 -1
    • right[i] 存储柱子 i 右侧第一个比其矮的柱子的索引,如果不存在,设置为 n
    • 使用 Stack 存储柱子的索引,用于计算左右边界。
  2. 计算左边界

    • 遍历所有柱子:
      • 如果当前柱子的高度小于栈顶柱子的高度,弹出栈顶元素,直到找到一个高度小于当前柱子的元素。
      • 如果栈为空,说明当前柱子左侧没有比它矮的柱子,设置 left[i] = -1
      • 否则,设置 left[i] = stack.peek(),即栈顶元素是左边第一个比当前柱子矮的位置。
    • 将当前柱子的索引压入栈中。
  3. 计算右边界

    • 从右到左遍历所有柱子:
      • 使用类似的方法计算每个柱子右边第一个比它矮的位置。
  4. 计算最大矩形面积

    • 遍历所有柱子,以每个柱子作为最矮柱子,计算矩形的最大面积。
    • 使用公式 (right[i] - left[i] - 1) * heights[i] 来计算每个柱子的最大矩形面积。

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

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

相关文章

vue3获取视频时长、码率、格式等视频详细信息

前言&#xff1a; 我们在上传视频需要视频的帧数等信息的时候&#xff0c;上传组件无法直接读取帧数等信息 方法&#xff1a;通过mediainfo.js来获取视频的帧率、总帧数和视频的总时长 mediainfo.js地址&#xff0c;想详细了解的可以去看看git地址&#xff1a;https://githu…

【最新华为OD机试E卷-支持在线评测】查找充电设备组合(200分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

【机器学习-神经网络】循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

软件测试基础总结+面试八股文

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

C++笔记15•数据结构:二叉树之二叉搜索树•

二叉搜索树 1.二叉搜索树 概念&#xff1a; 二叉搜索树又称二叉排序树也叫二叉查找树&#xff0c;它可以是一棵空树。 二叉树具有以下性质: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都…

Ubuntu 下载/安装

官网 Enterprise Open Source and Linux | UbuntuUbuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.https://ubuntu.com/ 下载 安装 完结撒花&#xff01;

论文学习(一):基于遥感技术的凉山州森林火险预测方法研究

文章目录 摘要部分一、绪论二、研究区历史火情分析2.1凉山州森林火灾年际变化特征2.2凉山州森林火灾月际变化特征2.3凉山州森林火灾空间分布特征2.4森林火灾等级与起火原因分析 三、数据与方法3.1数据来源3.2数据预处理3.3研究方法3.3.1逻辑回归&#xff1a;最大似然估计3.3.2决…

C++知识点总结

一、C简介 1、c的特点&#xff1a; 1、在支持C语言的基础上&#xff0c;全面支持面向对象编程 2、编程领域广泛&#xff0c;功能强大 3、C语言标准一直在保持更新 4、支持底层操作的面向对象编程语言 5、在面向对象编程语言中执行效率高 2、面向过程与面向对象的区别 面向过程是…

IDEA 安装,激活,使用,常用插件

1. 下载安装&#xff0c; 自行下载 2.打开到这步立马退出 3.使用工具 点击工具 等待几秒 查看效果。 恭喜你&#xff0c;成功&#xff01;&#xff01;&#xff01;&#xff01; 恭喜你&#xff0c;成功&#xff01;&#xff01;&#xff01;&#xff01; 恭喜你&#xff0…

移动硬盘显示需要格式化怎么办?教你快速应对

在日常使用电脑的过程中&#xff0c;移动硬盘因其便携性和大容量存储的特点&#xff0c;成为了许多用户备份和传输数据的重要工具。 然而&#xff0c;有时当我们连接移动硬盘到电脑时&#xff0c;可能会遇到一个令人头疼的问题——系统提示“移动硬盘需要格式化”。面对这种情…

ZPC显控一体机,精彩不止一面!

显控一体机的应用&#xff0c;有很多场景会遇到自带显示屏固定不灵活、尺寸不够大等问题。扩展屏幕便是一个很好的解决方案&#xff01;本文将带您解锁ZPC显控一体机的“多面精彩”。 ZPC简介 ZPC系列显控一体机 是广州致远电子全新研发的集“显示”“控制”一体化的高性能显控…

使用pytorch深度学习框架搭建神经网络

简介 现在主流有两个框架pytorch和TensorFlow,本文主要介绍pytorch PyTorch&#xff1a;由 Facebook 的人工智能研究小组开发和维护。PyTorch 以其动态计算图&#xff08;Dynamic Computational Graph&#xff09;和易用性著称&#xff0c;非常适合研究人员和开发者进行实验和…

在SOLIDWORKS中高效转换:从实体模型到钣金件的设计优化

在设计生产中&#xff0c;当我们收到中间格式的模型文件时&#xff0c;并希望将其转换为钣金件以进一步加工生产&#xff0c;该怎么做呢&#xff1f; 利用SOLIDWORKS软件&#xff0c;可以直接将实体模型转换为钣金件&#xff0c;来完成后续的设计。 中性文件 钣金件 一、设置…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

_get_gt_mask、cat_mask、_get_other_mask

import torch# 定义获取标签掩码的函数 def _get_gt_mask(logits, target):print("原始 logits:\n", logits)print("目标 target:\n", target)# 将 target 拉平为一维张量target target.reshape(-1)print("拉平后的 target:\n", target)# 创建一…

C端产品如何转行成为大模型产品经理?

1、能力优劣势 C端产品经理的优势在于对用户需求、用户体验、数据分析、市场竞争等方面有较深的理解和实践&#xff0c;能够从用户视角出发&#xff0c;设计出吸引和留住用户的产品功能和交互。 C端产品经理的劣势在于对大模型的技术原理、应用场景、生态建设等方面缺乏足够的…

探伤仪的介绍

探伤仪就是一个高级测厚仪而已。 也有人说探伤仪功能那么强大&#xff0c;怎么说实质上就是一个测厚仪呢&#xff0c; 大家想想看&#xff0c;所谓探伤&#xff0c;最基本的要求就是测出工件内部缺陷的位置&#xff0c;这不就是测厚功能吗&#xff0c; 当然除了测厚&#xf…

pyro ExponentialLR 如何设置优化器 optimizer的学习率 pytorch 深度神经网络 bnn,

第一。pyro 不支持 “ReduceLROnPlateau” &#xff0c;因为需要Loss作为输入数值&#xff0c;计算量大 pytorch的学习率调整 视频 看这个博主的视频 05-01-学习率调整策略_哔哩哔哩_bilibili 第二 &#xff0c;svi 支持 scheduler注意点&#xff0c; 属于 pyro.optim.PyroOp…

从0到1深入理解vite

一、什么是构建工具 ts:如果遇到ts文件&#xff0c;我们需要使用tsc把ts转换为jsreact/vue &#xff1a; 安装react-compiler、vue-conplier 将我们写的jsx或者vue文件转换成render函数less/sass/postcss/somponent-style:我们又需要less-loader、sass-loader等一系列编译工具…

目标检测-RT-DETR

RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题&#xff0c;通过引入高效的 Transformer 模块和优化的检测头&#xff0c;提升了模型的实时性和准确性。RT-DETR 可…