LeetCode题练习与总结:柱状图中最大的矩形--84

2024-05-04 19:20

本文主要是介绍LeetCode题练习与总结:柱状图中最大的矩形--84,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给定 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

二、解题思路

1. 创建一个栈,用于存储柱子的索引。

2. 遍历每个柱子,对于当前遍历到的柱子,执行以下操作:

  • 当栈不为空且当前柱子的高度小于栈顶柱子的高度时,说明找到了栈顶柱子右边的第一个小于它的柱子,可以计算栈顶柱子的最大面积。此时,栈顶柱子左边第一个小于它的柱子是栈中下一个元素,右边第一个小于它的柱子是当前遍历到的柱子。因此,可以计算出栈顶柱子的最大面积,并将其从栈中弹出。重复这个步骤,直到栈为空或者栈顶柱子的高度小于等于当前柱子的高度。
  • 将当前柱子的索引入栈。

3. 遍历完成后,栈中可能还有柱子的索引。这些柱子右边没有小于它的柱子,因此可以认为右边第一个小于它的柱子是数组的最右端。对于栈中剩余的每个柱子,重复步骤2中的面积计算过程。

4. 在整个过程中,记录下最大的面积,最后返回这个面积。

三、具体代码

class Solution {public int largestRectangleArea(int[] heights) {int maxArea = 0;Deque<Integer> stack = new LinkedList<>();int[] extendedHeights = new int[heights.length + 2]; // 扩展数组,首尾各添加一个高度为0的柱子System.arraycopy(heights, 0, extendedHeights, 1, heights.length);for (int i = 0; i < extendedHeights.length; i++) {while (!stack.isEmpty() && extendedHeights[i] < extendedHeights[stack.peek()]) {int height = extendedHeights[stack.pop()];int width = i - stack.peek() - 1;maxArea = Math.max(maxArea, height * width);}stack.push(i);}return maxArea;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 我们遍历了扩展后的数组一次,其中 n 是原始数组 heights 的长度。
  • 在每次迭代中,我们可能会弹出栈中的元素,并且每个元素最多只会被弹出一次。
  • 因此,尽管内部有 while 循环,但每个元素只会被处理一次,所以总的时间复杂度是 O(n)。
2. 空间复杂度
  • 我们使用了一个栈来存储索引,在最坏的情况下,数组中的所有元素都按顺序入栈一次,因此栈的大小为 O(n)。
  • 我们还使用了一个扩展数组 extendedHeights,其长度为原始数组长度加上2,因此空间复杂度也是 O(n)。
  • 除了栈和扩展数组之外,我们只使用了固定数量的额外空间,如循环变量等,这些额外的空间使用不依赖于输入数组的大小。

五、总结知识点

1. 单调栈(Monotonic Stack)

  • 单调栈是一种特殊的栈结构,用于解决一类需要维护数据单调性的问题。
  • 在这个问题中,我们使用单调递增栈来维护柱子的高度,以便快速找到每个柱子左右两边第一个比它矮的柱子。

2. 数组操作

  • System.arraycopy() 方法用于数组拷贝,将原数组 heights 的内容拷贝到扩展数组 extendedHeights 中。
  • 扩展数组在原数组的首尾各添加了一个高度为0的柱子,以便在遍历结束时能够计算所有剩余在栈中的柱子的面积。

3. 链表(LinkedList)

  • Deque<Integer> 接口和 LinkedList<Integer> 类是 Java 中用于实现栈和队列的数据结构。
  • 在这个问题中,我们使用 LinkedList 作为栈,用于存储柱子的索引。

4. 循环(Loop)

  • for 循环用于遍历扩展后的数组。

5. 条件语句(Conditional Statements)

  • while 循环和 if 语句用于根据条件执行不同的代码路径。
  • 在这个问题中,while 循环用于在当前柱子高度小于栈顶柱子高度时,计算栈顶柱子的最大面积并将其从栈中弹出。

6. 算法设计

  • 这个问题涉及到算法设计,即如何高效地计算最大矩形面积。
  • 通过使用单调栈,我们可以在 O(n) 的时间复杂度内解决这个问题,这比暴力解法(O(n^2))更高效。

7. 数学运算

  • 矩形面积的计算涉及到基本的乘法运算。

8. 函数和方法调用

  • Math.max() 方法用于比较并返回两个数中的最大值。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:柱状图中最大的矩形--84的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959933

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio