【单调栈】力扣85.最大矩形

server/2024/10/20 7:15:36/

好久没更新了 ~ 我又回来啦!

两个好消息:

  • 我考上研了,收到拟录取通知啦!
  • 开放 留言功能 了,小伙伴对于内容有什么疑问可以在文章底部评论,看到之后会及时回复大家的!

前面更新过的算法二叉树递归、动态规划、单调栈 小伙伴们学的怎么样了?


今天我们继续更新 单调栈 的题目,一起学习吧!

(还没看过前几篇介绍的小伙伴赶快关注,在 单调栈 合集里查看哦!)


力扣85.最大矩形

给定一个仅包含 0 和 1 、大小为 rows * cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1 :

输入: matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]

输出: 6

解释: 如图

思路分析

上道题目我们解决了柱状图的问题,我们来思考一下,是否能够将此题也转化为与柱状图类似的思路呢?当然可以。

来看下面这个对比图,是不是很类似呀:

阴影部分都是矩形。

因此,我们可以将矩阵中每列 1 的个数看做是右侧的柱状图的高度,这样两道题目就 划归 到一起了。

关键点: 以某一行作为底边,看必须以这一行为底的矩阵每列的最大高度是多少。从而转化为 上道题目。

所以,我们的首要任务是,统计出以该行为底的高度是多少,之后再调用上道题的代码求解出矩形面积即可。


根据 上一篇 总结的经验,只需考虑在含有相同值时,最后一个相同元素是否能够将答案计算正确呢?答案是可以的

这里就不再赘述了,不太懂的小伙伴可以去查看上一篇文章哦 ~

代码

public static int maximalRectangle(char[][] map) {if (map == null || map.length == 0 || map[0].length == 0) {return 0;}int maxArea = 0;int[] h = new int[map[0].length];for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[0].length; j++) {h[j] = map[i][j] == '0' ? 0 : h[j] + 1;}// 调用上道题目的 求最大矩形的面积函数maxArea = Math.max(maxRecFromBottom(h),maxArea);}return maxArea;
}

这里的 maxRecFromBottom() 函数就是上篇文章的 largestRectangleArea1() 函数哦!一样的套路 ~

代码解释

这里采用了 压缩数组 的方式进行计算(这个思想在 动态规划专题 中也练习过哦~)。

一维数组 h[map[0].length] 用来存放当前所在行的信息:以当前行为底,第 j 列的高度为多少。

注意:

  • 如果当前位置为 0 时,数组值归 0 。(当然不能以 0 为底啦)!
  • 否则,上一行此位置的值 + 1,就是当前此位置 1 的最大的高度。

得到了柱状图的高度大小之后,就划归成了计算柱状图的最大面积了,直接套用 上道题的代码 即可~

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!

关注回复「ACM紫书」获取 ACM 算法书籍~

记得转发哦!


http://www.ppmy.cn/server/6304.html

相关文章

EXCEL VBA限制工作数据批号或者自定义规则完整

EXCEL VBA限制工作数据批号或者自定义规则完整 Private Sub Worksheet_Change(ByVal Target As Range)Dim nRow%, Arr(), cMc$, cPc$, cTxt$, nSum!If Target.Row 1 Or Target.Column <> 4 Then Exit SubIf Target.CountLarge > 1 Then Exit SubcMc Target.Offset(0…

基于Hadoop的石油大数据平台设计

基于Hadoop的石油大数据平台设计 Design of an oil big data platform based on Hadoop 完整下载链接:基于Hadoop的石油大数据平台设计 文章目录 基于Hadoop的石油大数据平台设计摘要第一章 绪论1.1 研究背景1.2 研究意义1.3 国内外研究现状1.4 本文研究内容与结构 第二章 Ha…

Java快速排序知识点(含面试大厂题和源码)

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;采用分治法&#xff08;Divide and Conquer&#xff09;的策略来对一个数组进行排序。快速排序的平均时间复杂度为 O(n log n)&#xff0c;在最坏的情况下为 O(n^2)&#xff0c;但这种情况很少发生…

【php快速上手(十一)】

目录 PHP快速上手&#xff08;十一&#xff09;PHP 连接数据库和创建数据库PHP 连接数据库使用 MySQLi连接 MySQL 数据库使用 PDO 连接 MySQL 数据库 PHP创建数据库使用MySQLi创建MySQL数据库&#xff1a;使用PDO创建MySQL数据库&#xff1a; PHP快速上手&#xff08;十一&…

【重生之我在学Android原生】Media3

前言 内容颇多&#xff0c;尽量从简 ExoPlayer使用 官方文档 参考文章 实现效果 Android&#xff08;java&#xff09; 使用ExoPlayer播放视频&#xff0c;自定义ExoPlayer界面&#xff0c;记录播放位置&#xff08;横屏竖屏切换/切换至后台等&#xff09; 案例实现 创建…

电脑工作者缓解眼部疲劳问题的工具分享

背景 作为以电脑为主要工作工具的人群&#xff0c;特别是开发人员&#xff0c;我们每天都需要长时间紧盯着屏幕&#xff0c;进行代码编写、程序调试、资料查询等工作。这种持续的工作模式无疑给我们的眼睛带来了不小的负担。一天下来&#xff0c;我们常常会感到眼睛干涩、疲劳…

浏览器工作原理与实践--HTTPS:让数据传输更安全

浏览器安全主要划分为三大块内容&#xff1a;页面安全、系统安全和网络安全。前面我们用四篇文章介绍了页面安全和系统安全&#xff0c;也聊了浏览器和Web开发者是如何应对各种类型的攻击&#xff0c;本文是我们专栏的最后一篇&#xff0c;我们就接着来聊聊网络安全协议HTTPS。…

Qt实现XYModem协议(四)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…