73、栈-柱状图中最大的矩形

思路:

 矩形面积:宽度*高度

高度如何确定呢?就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。

当我们在处理直方图最大矩形面积问题时,遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定一个矩形的左右边界:

  1. 左边界的确定

    • 在单调递增栈中,每一个柱子的左边界是由前一个比它矮的柱子决定的。当一个柱子入栈时,栈中前一个柱子的高度必定小于或等于当前柱子的高度。因此,当某个柱子被从栈中弹出时,意味着找到了一个比它高的左边界,这个左边界正是栈中该柱子前面的柱子的位置。
  2. 右边界的确定

    • 当我们遇到一个比栈顶柱子矮的新柱子时,这个新柱子的索引就成了栈顶柱子的右边界,因为这标志着右侧出现了一个无法继续扩展当前栈顶柱子宽度的点。此时,栈顶柱子及其之前的所有比它高的柱子都需要被处理,因为我们已经找到了它们的右边界。
  3. 面积计算

    • 弹出栈顶元素(某个高柱子),此时可以确定该柱子的高度,而宽度是从它的左边界(前一个栈元素,如果栈为空则为-1)到右边界(当前低柱子的前一个位置)之间的距离。计算出的面积就是以该高柱子为高的最大矩形面积。

代码如下:

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;  // 直方图的柱子个数
        Stack<Integer> stack = new Stack<>();  // 使用栈来存储柱子的索引
        int res = 0;  // 最大面积初始化为0

        // 遍历每个柱子
        for (int i = 0; i < n; i++) {
            // 当栈不为空,并且当前柱子的高度小于栈顶柱子的高度时
            while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {
                int height = heights[stack.pop()];  // 获取栈顶柱子的高度
                int width = 0;  // 初始化宽度
                // 如果栈为空,说明当前弹出的柱子左边没有比它矮的柱子
                if (stack.isEmpty()) {
                    width = i;  // 宽度为当前索引
                } else {
                    // 否则,宽度为当前索引减去新的栈顶索引减一
                    width = i - stack.peek() - 1;
                }
                // 计算可能的最大面积,并更新结果
                res = Math.max(res, width * height);
            }
            // 将当前柱子的索引入栈
            stack.push(i);
        }

        // 清理栈中剩余的柱子
        while (!stack.isEmpty()) {
            int height = heights[stack.pop()];  // 获取栈顶柱子的高度
            int width = 0;  // 初始化宽度
            // 如果栈为空,说明右边没有柱子
            if (stack.isEmpty()) {
                width = n;  // 宽度为柱子总数
            } else {
                // 否则,宽度为柱子总数减去新的栈顶索引减一
                width = n - stack.peek() - 1;
            }
            // 计算可能的最大面积,并更新结果
            res = Math.max(res, width * height); 
        }
        return res;  // 返回最大面积
    }
}

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

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

相关文章

Hotcoin Research|玩赚WEB3:Seraph零成本赚取技巧

在《Seraph》这款游戏里&#xff0c;要提升自己的游戏技能和体验&#xff0c;了解如何免费赚取游戏货币灵魂晶石并挑战游戏主线是非常重要的。你可以通过卖东西、参加虚空异界地图和混沌秘境来在游戏里赚更多的钱&#xff0c;并更享受游戏的乐趣。最酷的是&#xff0c;得到的灵…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

三星电子与蔡司达成新合作 | 百能云芯

近日&#xff0c;三星电子会长李在镕的欧洲之行备受瞩目&#xff0c;他特别造访了德国光学巨擘蔡司的总部&#xff0c;并与其高层进行了深入的会谈。 据韩国前锋报报道&#xff0c;三星电子在28日宣布&#xff0c;李在镕在26日与蔡司执行长兰普瑞特&#xff08;Karl Lamprecht&…

企业智能名片小程序:AI智能跟进功能助力精准营销新篇章

在数字化浪潮的推动下&#xff0c;企业营销手段不断迭代升级。如今&#xff0c;一款集手机号授权自动获取、智能提醒、访客AI智能跟进及客户画像与行为记录于一体的企业智能名片小程序&#xff0c;正以其强大的AI智能跟进功能&#xff0c;助力企业开启精准营销的新篇章。 通过深…

SQL提升

1. SQL TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。 **注释&#xff1a;**并非所有的数据库系统都支持 TOP 子句。 1.1 SQL TOP 语法 SQL Server 的语法&#xff1a; SELECT TOP number|percent c…

期权交割对股市是好是坏?2024期权交割日一览表

期权交割是指期权买方在期权合约到期日或之前行使期权&#xff0c;卖方履行义务&#xff0c;按照约定的价格和数量与期权卖方进行标的物的买卖或现金结算的过程。 交割方式 期权交割可以分为实物交割和现金交割&#xff0c;具体取决于合约规定。 实物交割 实物交割是指期权买…

【Threejs】获取相交网格相交线

BVH-INTER 1 导入threejs-mesh-bvh库 import * as THREE from "three"; import { SAH, acceleratedRaycast, computeBoundsTree, disposeBoundsTree } from "three-mesh-bvh"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.j…

photoshop如何使用PS中的吸管工具吸取软件外部的颜色?

第一步&#xff0c;打开PS&#xff0c;随意新建一个画布&#xff0c;或打开一个图片。 第二步&#xff0c;将PS窗口缩小&#xff0c;和外部窗口叠加放置&#xff0c;以露出后面的其它页面。 第三步&#xff0c;选中吸管工具&#xff0c;在PS窗口内单击一点吸取颜色&#xff0c;…

变电站自动化控制系统应用案例分析

变电站自动化控制系统介绍 变电站自动化控制系统用于大中型企业变电站项目&#xff0c;这类企业变压器多&#xff0c;日耗电量大。把多个变压器集中到一个电器平台上&#xff0c;集中管理分析&#xff0c;优化厂区用电管理&#xff0c;从而达到集中控制、集中分析、集中管理的…

【网络原理】以太网协议 | 以太网数据帧格式 | DNS域名解析系统

文章目录 一、以太网协议1.以太网数据帧格式MAC地址IP地址和MAC地址各自的用途 二、DNS 一、以太网协议 通过网线、光纤来通信&#xff0c;使用的就是以太网协议。 以太网协议&#xff0c;横跨了数据链路层和物理层。 1.以太网数据帧格式 由帧头载荷&#xff08;IP数据报&…

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…

13.4.1 实验1:配置VTP

1、使用目的 通过本实验可以掌握 VTP三种模式的区别。VTP工作原理。VTP的配置和调试方法 2、实验拓扑 配置VTP的实验拓扑如下图所示 3、实验拓扑 3.1、实验准备 通过命令 delete nash:van.dat和erasestartup-config把3台交换机的配置清除干净&#xff0c;重启交换机&#…

shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。

删除30天以前的日志 将日志推送到nas中&#xff0c;然后删除pod中的日志 pod挂载到本地 运行出现/bin/bash^M 1、删除30天以前的日志&#xff1a; #! /bin/bash# 定义源日志目录 LOG_DIR/home/log/ # 删除日志 find $LOG_DIR -type f -name "*.log" -mtime 30 -exec…

二维码门楼牌管理应用平台建设:智能化信息管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的建设意义二、二维码门楼牌管理应用平台的核心功能三、二维码门楼牌管理应用平台对城市管理的深远影响四、结语 前言 随着信息技术的快速发展&#xff0c;二维码门楼牌管理应用平台已成为城市治理的新宠。本文将深入探讨二维码门楼…

项目运行到手机端

运行到真机 手机和点到连在同一个wifi网络下面点击hbuiler上面的预览得到一个&#xff0c;network的网址这个时候去在手机访问&#xff0c;那么就可以访问网页了 跨域处理 这个时候可能会访问存在跨域问题 将uniapp的H5版本运行到真机进行调试&#xff0c;主要涉及到跨域问题…

Avalonia .NET构建Linux桌面应用

目录 &#x1f47b;前言 &#x1f4bb;安装Avalonia &#x1f4e6;创建项目 &#x1f4da;在win下运行 ​&#x1f511;打包发布​编辑 &#x1f4fb;在linux下运行 环境WIN10 VS2022 debian &#x1f47b;前言 Avalonia 是一个用于创建跨平台用户界面 (UI) 的开源框架…

c++day7

【4】weak_ptr //引入weak_ptr解决循环引用问题 #include <iostream> #include <memory> using namespace std; class Test; class Demo { public:weak_ptr<Test> t; //指向Test类的弱智能指针Demo(){cout << "Demo的无参构造" << …

MySQL —— 表的基本操作

一、创建 1.语法 create table 表名称( 自定义变量1, 自定义变量2, 自定义变量3&#xff08;最后一个变量末尾不需要加任何标点符号&#xff09; )charset字符集 collate校验集 engine存储引擎; ps&#xff1a;若是不具体给字符集、校验集、储存引擎&#xff0c;则采用配置文件…

COUNT作为子查询

文章目录 假如需要显示customers表中每个客户的订单总数。子查询对于检索出的10001客户&#xff0c;统计其在orders表中的订单数目。为了对每个客户执行COUNT(*)计算&#xff0c;应该将COUNT(*)作为一个子查询。 联结 假如需要显示customers表中每个客户的订单总数。 子查询 …

牛客热题:判断链表是否有环

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;判断链表是否有环题目链接方法一…
最新文章