Java 中直方图的最大矩形面积2025年3月17日 | 阅读11分钟 在本节中,我们将探讨如何在直方图中计算最大矩形面积。 直方图中的最大矩形面积是什么?要创建的最大矩形应由连续的条形组成。为了简单起见,我们将假定每个条形的宽度为 1。 例如,对于具有 7 个条形高度为 {7, 3, 6, 5, 6, 2, 7} 的直方图,可能的最大矩形面积为 15。最大面积以黄色突出显示。 ![]() 让我们讨论解决此问题的各种方法。 朴素方法在此方法中,我们将逐一考虑每个条形作为起点,并从该起点开始,每次通过逐一考虑下一个条形来计算矩形面积。每次计算矩形面积时,我们将其与当前最大面积进行比较(最初,最大面积初始化为 0)。 文件名:LargestRectArea.java 输出 The maximum rectangular area is: 15 时间复杂度:在上面的程序中,我们使用了 2 次幂的嵌套 for 循环。因此,该程序的总复杂度为 O(n2),其中 n 是输入数组中存在的元素总数。 分治法该概念是找到输入数组中值为最小的索引。一旦找到值为最小的索引,最大面积就是以下三个值中的最大值。
观察下面的程序。 输出 The maximum rectangular area is: 15 时间复杂度:在上面的程序中,时间复杂度取决于两件事:一是线段树,二是查找最大矩形面积。构建线段树所需的时间复杂度为 O(n),查找最大矩形面积所需的时间复杂度为 O(log(n))。因此,时间复杂度变为 O(n) + O(n * log(n)),渐进时间复杂度变为 O(n * log(n)),其中 n 是输入数组中存在的元素总数。 如果我们比较以上两个程序,会发现后一个程序更优化,因为它解决问题所需的时间更少。但是,我们可以进一步优化它。让我们在以下方法中进行查看。 方法:使用栈让我们看看使用栈查找矩形面积的算法。 步骤 1:创建一个栈用于压入和弹出元素。 步骤 2:从第一个条形开始,对每个条形 "histArr[j]" 执行以下任务,其中 'j' 从 0 到 s - 1。
步骤 3:如果栈中还有一些条形,则逐一弹出栈中的所有条形,并对每个移除的条形重复步骤 2(ii)。 文件名:LargestRectArea2.java 输出 The maximum rectangular area is: 15 使用辅助数组另一种方法是找到直方图中每个条形的前一个更小条形和后一个更小条形,这将通过两个辅助数组来实现。请参阅以下算法。 步骤 1:首先,我们采用两个辅助数组 leftSmaller[] 和 rightSmaller[],并将它们分别初始化为负数和 n。 步骤 2:对于每个元素,我们在 rightSmaller[] 和 leftSmaller[] 数组中分别保留后一个更小元素和前一个更小元素的索引。这需要 O(n) 的时间。 步骤 3:对于每个条形,我们通过将第 j 个条形作为 leftSmaller[j] 和 rightSmaller[j] 范围内的最短条形来计算面积,并将其乘以 leftSmaller[j] 和 rightSmaller[j] 的差值。 步骤 4:可以通过比较每个条形的面积来计算最大面积。不同条形的面积在步骤 3 中计算。 文件名:LargestRectArea3.java 输出 The maximum rectangular area is: 15 时间复杂度:最后两种方法的复杂度为 O(n),其中 n 是数组中存在的元素总数。 下一主题Java 中的多边形数 |
数字图像分析和计算机视觉都严重依赖于图像处理。为了获得预期的结果,这需要图像的修改。亮度增强是图像处理的基本方法,可以使图像中的物体变亮,以便它们更... ...
7 分钟阅读
ArrayList 和 HashMap 在 Java 中的区别 在 Java 中,ArrayList 和 HashMap 是 Java Collection Framework 中常用的两个类。即使它们都属于 Collection Framework,但它们存储和处理数据的方式却不同。在本节中,我们将...
阅读 2 分钟
在本教程中,我们将学习 Java 中的“宏大数”(Magnanimous number)。宏大数是指至少有 2 位数字,并且当数字的左部分与右部分相加时始终生成素数的数字... ...
5 分钟阅读
Java 是一种流行且通用的编程语言,它提供了多种开发和部署应用程序的方法。创建 Java 程序的两种常见方法是独立应用程序和 Applet。这些方法服务于不同的目的并具有独特的特性。在本节中,我们将探讨独立应用程序和 Applet... ...
阅读 3 分钟
在 Java 中,CloneNotSupportedException 是一个异常,表示尝试克隆对象失败,因为该对象没有实现 Cloneable 接口。Cloneable 接口是一个标记接口,表示对象可以被克隆。当一个对象不...
阅读 2 分钟
?任何 Java 对象的 toString() 函数都返回该对象的字符串表示。默认情况下,此函数会生成一个包含对象类名、"@" 符号以及其十六进制哈希码的字符串。但是,在某些情况下,您可能希望... ...
阅读 3 分钟
? Java 程序经常需要解析日期和时间,尤其是那些涉及计划、事件管理和数据分析的程序。LocalDate、LocalTime、LocalDateTime 和 DateTimeFormatter 类只是 Java 中用于处理日期和时间的类和方法中的一部分。要分解日期和...
阅读 4 分钟
在 Java 中,一元运算符是只能与一个操作数一起使用的运算符。它用于表示正值或负值、将值加/减 1,以及对布尔值取反。一元运算符的类型 Java 中有五种一元运算符:一元...
5 分钟阅读
字符串是字符序列的表示。在 Java 编程中,开发人员最常使用的类之一是字符串。然而,Java 创建了 StringBuilder 和 StringBuffer 工具类,以便更容易地操作字符串,因为字符串是不可变的。字符串 字符串是... ...
阅读 3 分钟
在本节中,我们将讨论如何创建用于购物账单的 Java 程序。要生成购物账单,我们需要产品 ID、名称、数量、单价和产品的总价,以及总计金额。除了产品详细信息外,我们还可以添加……
阅读 12 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India