【LeetCode】84.柱状图中最大的矩形

news2024/9/24 23:30:46

题目

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

解答

源代码

class Solution {
    public int largestRectangleArea(int[] heights) {
        int[] left = new int[heights.length];
        int[] right = new int[heights.length];
        Deque<Integer> stack = new ArrayDeque<>();

        for (int i = 0; i < heights.length; i++) {
            while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
                stack.pop();
            }

            left[i] = (stack.isEmpty() ? -1 : stack.peek());
            stack.push(i);
        }

        stack.clear();

        for (int i = heights.length - 1; i > -1; i--) {
            while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
                stack.pop();
            }

            right[i] = (stack.isEmpty() ? heights.length : stack.peek());
            stack.push(i);
        }

        int res = 0;
        for (int i = 0; i < heights.length; i++) {
            res = Math.max(res, (right[i] - left[i] - 1) * heights[i]);
        }

        return res;
    }
}

总结

最大矩形的高度一定是某个柱子的高度,所以我们只要把每个柱子的高度往两边延伸,记录下它们能达到的最大的宽度,计算出矩形面积。

利用暴力枚举虽然也能找到某个柱子两边小于它且离它最近的柱子,但这明显不太优雅,肯定不是最佳解法。

为了跳过不必要的比较,我们所需要用到的就是“单调栈”。栈中存放的是柱子对应的下标,从栈底到栈顶,下标单调递增,下标对应的柱子高度也单调递增。从左到右遍历到某个柱子时,要用它和栈顶下标对应的柱子高度比较,如果低于等于栈顶对应柱子,就出栈直到该柱子高于栈顶对应柱子,那么此时栈顶下标对应的柱子就是当前柱子左边小于它且离它最近的柱子。同理,得到右边的。

这样经过两次遍历,我们可以得到每个柱子左右两边的边界。这里有特殊情况,如果左右两边没有比自己低的柱子,那就将边界设为0 / heights.length。然后计算出以每个柱子高度为矩形高度得到的矩形面积,比较选出最大的面积。

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

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

相关文章

如何理解attention中的Q、K、V?

y直接用torch实现一个SelfAttention来说一说&#xff1a; 1、首先定义三哥线性变换&#xff0c;query&#xff0c;key以及value&#xff1a; class BertSelfAttention(nn.Module):self.query nn.Linear(config.hidden_size, self.all_head_size)#输入768&#xff0c;输出768…

2第一个Java程序

目录 1第一个Java代码 2类class 3运行Java文件 1第一个Java代码 public class Hello {public static void main(String[] args) {System.out.println("Hello, world!");} } 2类class public class Hello {public static void main(String[] args) {System.ou…

书箱扫描仪真神器,免拆书,AI助力自动识别翻页

平板扫描仪见多了&#xff0c;馈纸式扫描仪我们也介绍过了&#xff0c;但它们都不适合扫描书箱&#xff0c;如果您一定要用它们来完成这项任务&#xff0c;那将很费劲&#xff0c;首先&#xff0c;您得将书拆成一页一页的&#xff0c;然后再放进去扫&#xff0c;非常麻烦&#…

Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

分库分表篇-2.3 springBoot 集成Mycat(1.6)

文章目录 前言一、springBoot 集成Mycat(1.6) 步骤&#xff1a;二、query_cache_size unknown 处理&#xff1a;总结&#xff1a; 前言 在springboot 项目中我们应该如何集成mycat 然后让其帮助我们进行数据的分库和分表处理呢。 一、springBoot 集成Mycat(1.6) 步骤&#xff…

HTTP与SOCKS5的区别对比

在互联网世界中&#xff0c;服务器是一种重要的工具&#xff0c;可以帮助我们提高网络安全性等。今天&#xff0c;我们将重点关注两种常见的技术&#xff1a;HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点&#xff0c;并通过Python代码示例学习如何使用它们。 HT…

跨境海淘攻略:如何实现自己批量养买家账号海淘

近年来&#xff0c;随着互联网的发展&#xff0c;网购已经成为人们日常生活中不可或缺的一部分。不仅在国内购买商品&#xff0c;在跨境电商行业越来越成熟&#xff0c;很多的消费者开始选择购买国外平台商品&#xff0c;价格相比国内专柜来说会更为优惠。因此&#xff0c;海淘…

书单制作方法详细步骤分享,想学的小伙伴看过来

如果你是一个热爱阅读的人&#xff0c;那么制作一份书单可能是一件有趣和有用的事情。在这篇文章中&#xff0c;我们将分享一些书单制作的方法和注意事项。 选择主题和书籍 首先&#xff0c;你需要选择一种主题&#xff0c;以便你可以按照主题来选择书籍。选择一个你感兴趣的主…

MES系统车间生产进度监控

随着制造业竞争的加剧和市场需求的不断变化&#xff0c;车间生产进度监控成为制造企业提高生产效率、降低成本以及实现及时决策的重要环节。在这个背景下&#xff0c;制造执行系统&#xff08;MES&#xff09;的车间生产进度监控模块应运而生。 一、车间生产进度监控MES系统的定…

TensorFlow 的基本概念和使用场景介绍

文章目录 一、TensorFlow基本概念1. 张量&#xff08;Tensor&#xff09;2. 计算图&#xff08;Computation Graph&#xff09;3. 会话&#xff08;Session&#xff09; 二、TensorFlow使用场景1. 机器学习&#xff08;Machine Learning&#xff09;2. 计算机视觉&#xff08;C…

Fedora Linux Flatpak 八月推荐应用

导读本文介绍了 Flathub 中可用的项目以及安装说明。 Flathub 是获取和分发适用于所有 Linux 的应用的地方。它由 Flatpak 提供支持&#xff0c;允许 Flathub 应用在几乎任何 Linux 发行版上运行。 请阅读 “Flatpak 入门”。要启用 Flathub 作为你的 Flatpak 提供商&#xff…

用Airtest快速实现手机文件读写与删除功能

1. 前言 前几天有同学留言&#xff0c;能不能安排“读写手机文件”的示例。我们今天就来实现这个小功能。 当然&#xff0c;熟悉adb的同学&#xff0c;看到这个需求&#xff0c;肯定很开心&#xff0c;不就是一个 adb push 和 adb pull 嘛&#xff0c;非常简单呀。 确实如此…

算法通关村——原来滑动窗口如此简单

1. 子数组最大平均数 I 最大平均数 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,12…

centos中得一些命令 记录

redis命令 链接redis数据库的命令 redis-cli如果 Redis 服务器在不同的主机或端口上运行&#xff0c;你需要提供相应的主机和端口信息。例如&#xff1a; redis-cli -h <hostname> -p <port>连接成功后&#xff0c;你将看到一个类似于以下的提示符&#xff0c;表…

基于PHP实现的计算机信息管理学院网站

《[含文档PPT源码等]精品基于PHP实现的计算机信息管理学院网站》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;php 前端技术&am…

1688商品详情 API

1688商品详情 API 1688 商品详情item_get接入测试 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_…

【Sword系列】Vulnhub靶机HACKADEMIC: RTB1 writeup

靶机介绍 官方下载地址&#xff1a;https://www.vulnhub.com/entry/hackademic-rtb1,17/ 需要读取靶机的root目录下key.txt 运行环境&#xff1a; 虚拟机网络设置的是NAT模式 靶机&#xff1a;IP地址&#xff1a;192.168.233.131 攻击机&#xff1a;kali linux&#xff0c;IP地…

ArcGIS Enterprise + ArcGIS Pro 常用服务类型发布

发布前设置 门户连接 首先Pro需要先连接portal 添加portal门户地址&#xff0c;注意只到WA一级地址&#xff0c;并登录&#xff1a; 登录完成后&#xff0c;右键&#xff0c;设置为活动门户&#xff1a; 1. 发布动态地图服务 关联数据文件夹&#xff1a; 拖拽数据到地图…

Fiddler安装与使用教程(1) —— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

【附安装包】Stata16安装教程

软件下载 软件&#xff1a;Stata版本&#xff1a;16语言&#xff1a;简体中文大小&#xff1a;338.13M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.com/s/…