Leetcode 85. 最大矩形

leetcode85. 最大矩形 hard 传送门 题目: 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 输入: 输出: 6 [[“1”,“0”,“1”,“0”,“0”], [“1”,“0”,“1”,“1”,“1”], [“1”,“1”,“1”,“1”,“1”], [“1”,“0”,“0”,“1”,“0”]] 参考解答 遍历每一行,动态统计每一列的高度 就转换成84题了 public int maximalRectangle(char[][] matrix 阅读详情

题目信息

LeetoCode地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目理解

该题是84题的升级版。84题给出了一个一维数组,即一行数据,每个元素是高度。而该题则是给出了二维数组,只需我们将每一行的高度自行求出,即可以运用相同的算法解决。

该题目的难点在于思维模型上,如何借助单调栈和数组给出的信息进行快速求解。

以示例1为例:

如果将每一行的1的高度(即连续的1的长度)以黄色标注出来,会发现只包含1的最大矩形出现在第三行里,2*3=6.

不难发现,每一个矩形都是由一列一列1组成的,我们要找到的就是能够组成最大矩形的那些列!

要找到它,我们需要总结一些规律

  • 矩形的长度和高度越大越好
  • 矩形的每一列高度一定相等

是的,只需要关注上面两条规律就足够了!我们在遍历每一行元素时,如果遇到某一列比之前的列小,那它就一定和之前比它高的列(同一行之前的列)没有任何关系了!此时需要回过头来算账,计算之前那些更高的列能够组成的最大矩阵有多大?高度我们已经确定,唯一需要确定的就是长度,即维持该高度的左右下标。显然,我们应该使用一种数据结构存储这样的下标,由于我们要倒着拿下标数据,栈就是最合适的了。那什么时候存下标呢?由于我们遇到更短的列时才会倒着拿数据,那当然要在当前列不短于上一列的情况下去插入下标了!!

口说无凭,让我们根据第三行的列高度数据来推演一下吧!

heightArray[2] = {3,1,3,2,2}

stack = {}

最初时栈是空的,此时是没有数据给你复盘的,所以我们要把3的下标存入栈
stack = {0}

然后我们看第二个元素1,糟糕,它比第一列还要短,它帮不上前面的列的忙了,所以我们要往回看,直到栈空,或者展栈内元素都不小于1.

由于栈里只有3,所以我们分析高度不小于3的列的左右下标。左下标显然是-1,因为不存在其他元素了。又下标则是当前元素1的下标1. 然后我们就可以更新一下可能的最大矩形面积=(右下标-左下标-1) * 高度 = (1-(-1) -1)* 3 = 3.

与第一列有关系的最大矩形求完了,它的下标也没有继续呆在栈里的意义了,所以我们出栈,继续上一过程,直到栈空,或者展栈内元素都不小于1.

很显然,3出栈完后这一过程就结束了,我们可以将第一列的1下标入栈,继而遍历低3列下标2的高度。又是3!而且比第二列大,它能帮的上忙!所以我们将它入栈。

stack = {1,2}

继续看第4列,嗯,它比栈顶元素高度3小,所以我们要重复上面出栈的过程。

可能的最大矩形面积= (3-1-1)*3 = 3.

栈顶2出栈后,新栈顶的高度和当前列的高度一样的,所以我们不再出栈,继续放入该列下标

stack={1,3}

继续看第5列,它和栈顶元素高度一样大,入栈!

stack={1,3,4}

至此,该行的所有元素都遍历完了,但是我们的工作并没有结束。因为栈还没有空。很显然,现在栈里每一个元素的高度,都可以维持到该行的最后一个元素!

所以我们要一个一个出栈,计算它们到该行最右边列所可能组成的最大矩形面积

对于下标4,可能的最大矩形面积= (5-3-1)*2 = 2.

对于下标3,可能的最大矩形面积= (5-1-1)*2 = 6.

对于下标1,可能的最大矩形面积= (5-(-1)-1)*1 = 5.

该行结束。其余的每一行都是按照该方法进行遍历,最后可以很容易得到最终答案6.

单调栈 写法

在实现上有一个小技巧,我们不用真的使用Deque,Stack等封装类,仅仅使用一个数组+指针的方式即可模拟栈,在时间效率上会更高。

public int maximalRectangle(char[][] matrix) {
        int max = 0;
        int h = matrix.length;
        int l = matrix[0].length;
        int[] heights = new int[l];
        for (int i = 0; i< h;i++) {
            //该循环可以累计每行的高度
            for (int j = 0; j < l; j++) {
                if (matrix[i][j] == '0') {
                    heights[j] = 0;
                } else {
                    heights[j]++;
                }
            }
            max = Math.max(max, findMax(heights));
        }
        return max;
    }

    private int findMax(int[] heights) {
        int l = heights.length;
        //使用数组模拟栈
        int[] stack = new int[l];
        // 栈顶指针, 值为-1时代表该栈为空
        int stackTopIdx = -1;
        int i = 0;
        int max = 0;
        while (i < l) {
            //栈空时入栈
            if (stackTopIdx == -1) {
                stack[++stackTopIdx] = i++;
            } else {
                //当前列高度大于等于栈顶,入栈
                if (heights[i] >= heights[stack[stackTopIdx]]) {
                    stack[++stackTopIdx] = i++;
                } else {
                    //当前列高度小于栈顶列,出栈结算直到栈空或者栈顶列高度小于等于当前列
                    //注意,该分支内i的值是没有++的,会循环遍历直到满足上述条件
                    int height = heights[stack[stackTopIdx--]];
                    // 此处如果发现栈里仅存在唯一一个元素,则说明之前不存在其他元素,亦或者是所有其他元素所对应的高度均超过height,所以我们可以大胆假设leftIndex = -1
                    int leftIndex = stackTopIdx <= -1 ? -1 : stack[stackTopIdx];
                    int rightIndex = i;
                    max = Math.max(max, (rightIndex-leftIndex-1) * height);
                }
            }
        }
        //该行所有列都遍历完栈还不为空,说明最后若干列高度越来越大
        //我们需要手动出列计算它们能够组成的最大矩形
        while (stackTopIdx>=0) {
            int height = heights[stack[stackTopIdx--]];
            int leftIndex = stackTopIdx <= -1 ? -1 : stack[stackTopIdx];
            max = Math.max(max, (l-leftIndex-1) * height);
        }
        return max;
    }

在Matrix 高m, 长n的规模下

时间复杂度: O(m*n),最复杂的操作是遍历每行列高度,以及在每一行里找寻最大矩阵

额外空间复杂度: O(n),我们需要一个临时数组存储每行的列高度,以及栈。

【力扣-困难】85. 最大矩形 给定一个仅包含0和1、大小为rows x 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 解释:最大矩形如上图所示。 示例 2: 输入:matrix = [] 输出:0 示例 3: 输入:matrix = [["0"]] 输出:0 示例 4... 阅读详情

相关推荐

LeetCode - #85 最大矩形(Top 100)

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 2215

leetcode(力扣) 221. 最大正方形(动态规划)

输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]也就是说,这三部分联合到一起,再加上当前遍历的右下角这一个小格子,才算是一个新的正方形,这也是为什么要取三者中的min值了,这也意味着,只有三个条件相等,边长才能变大。含义为若当前位置为111,则此处可以构成的最大正方形的边长,是其正上方,左侧,和左上界三者共同约束的,且为三者中的最小值加1。

深度不学习!!的博客 699

【困难】力扣算法题解析LeetCode85:最大矩形

本文介绍了求解二维二进制矩阵中最大全1矩形面积的高效算法。核心思想是将问题转化为柱状图中的最大矩形问题(LeetCode 84题),通过动态规划预处理高度数组,再使用单调栈快速计算最大面积。具体步骤包括:1)逐行计算高度数组;2)对每行高度数组应用单调栈算法求解最大矩形;3)维护全局最大值。Java实现代码详细展示了这一过程,并分析了时间复杂度和空间复杂度。该算法时间复杂度为O(rows×cols),空间复杂度为O(cols),能高效处理200×200规模的矩阵。

ylumwd的博客 515

​LeetCode刷题实战85: 最大矩形

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ...

程序IT圈 546

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 524

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

力扣热门算法题 85. 最大矩形,86. 分隔链表,88. 合并两个有序数组

85. 最大矩形,86. 分隔链表,88. 合并两个有序数组,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.24可通过leetcode所有测试用例。

引用原创内容标明出处即可 1213

Librepilot _64位window10环境下的搭建及一些坑的解决办法

  刚入IT行业的小菜鸟,在window上折腾了四天的librepilot地面控制站的搭建,想着这么辛苦不能白费了,看网上相关资料少得可怜,唯一一个详细教程还是在32位环境下,一大堆坑,所以把自己的经验写下来,供大家一起参考。 参考的原文是:https://www.cnblogs.com/jasonchan1202/p/7809937.html的博客,但是执行下来才发现这个博客对64位系统极其不...

weixin_41426339的博客 2727

[leetcode 中等 最大系列]85. 最大矩形 84. 柱状图中最大的矩形类似

题目描述 给定一个仅包含 0 和 1 、大小为 rows x 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 解释:最大矩形如上图所示。 示例 2: 输入:matrix = [] 输出:0 示例 3: 输入:matrix = [["0"]] 输出:0 示例

weixin_50088096的博客 286

FFT中的精度博弈:定点数缩放、块浮点与溢出处理在Vivado IP核中的实践权衡

本文探讨了在Vivado FFT IP核中实现高精度快速傅里叶变换的关键技术,包括定点数缩放策略、块浮点模式及溢出处理机制。通过分析不同精度控制方案的资源开销与性能权衡,为工程师在医疗成像、雷达信号处理等高动态范围应用中优化FFT实现提供实践指导。

melon的博客 1097

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

我是一条寻水的鱼 2978

LeetCode 力扣 85. 最大矩形

题目描述(困难难度) 给一个只有 0 和 1 的矩阵,输出一个最大的矩形的面积,这个矩形里边只含有 1。 解法一 暴力破解 参考这里-solution-for-your-reference>),遍历每个点,求以这个点为矩阵右下角的所有矩阵面积。如下图的两个例子,橙色是当前遍历的点,然后虚线框圈出的矩阵是其中一个矩阵。 怎么找出这样的矩阵呢?如下图,如果我们知道了以这个点结尾的连续 1 的个数的...

wind_liang的博客 2365

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1677

LeetCode 85:最大矩形

给定仅含0和1的二维矩阵,需找到1。O(n²m²)

m0_75126572的博客 1735

国产服务器系统的PXE无人值守自动化安装部署——以银河麒麟、统信UOS、OpenEuler这三类服务器系统为例

本文详细介绍了三种国产服务器系统(银河麒麟、统信UOS、OpenEuler)的PXE无人值守自动化安装方法。主要内容包括:1)从系统ISO镜像中提取内核文件和根系统文件;2)编写GRUB菜单引导文件;3)配置自动应答文件实现自动化安装;4)重启PXE服务并测试安装过程。文章特别强调了硬盘容量需≥100GB、UEFI模式设置等注意事项,并提供了root密码重置方法。对于x86架构Windows上模拟ARM架构系统安装也给出了具体命令。通过完整的配置流程,可实现国产服务器系统的快速批量部署。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1467

OpenClaw 股票自动化交易实践指南:从原理到实战的完整技术路径

量化交易策略的开发是一个系统工程,需要综合运用金融知识、编程技能和数据分析能力。OpenClaw通过引入提示词工程技术,大大降低了策略开发的技术门槛,使得更多投资者能够参与到量化交易中来。但技术只是工具,真正决定策略成败的是对市场的深刻理解和严格的风险管理。本章系统介绍了OpenClaw环境下的策略开发方法,从提示词驱动到传统代码实现,从参数优化到回测验证,涵盖了策略开发的完整流程。提示词驱动方式适合快速验证交易想法,传统代码方式适合实现复杂的定制逻辑,两种方式可以协同使用,发挥各自的优势。

lovely_yoshino的博客 5990

力扣85-最大矩形(巧妙利用上一题解答 Java版题解)

力扣85-最大矩形 一、原题题目 1.1 题目   给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 1.2 示例 示例1: 输入: matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]输出: 6解释: 最大矩形如上图所示。 示例2: 输入: matrix = []输出: 0

ItDaChuang的博客 486

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[LeetCode] 85、最大矩形

题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输出: 6 解题思路 这一题的算法本质上和84题Largest Recta...

aift的专栏 424

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode 85 - 最大矩形

题目描述 85. 最大矩形 解法一:柱状图+DP(Python) 详细参考 官方题解 class Solution: def maximalRectangle(self, matrix: List[List[str]]) -> int: maxarea = 0 dp = [[0] * len(matrix[0])for _ in range(len(m...

Aries_young的博客 367

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

力扣85 最大矩形的简单算法求解

1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] 输出: 6 2. 算法分析 回顾力扣84题,我们可以算一个数组的最...

胃病的不良少彦 816

LeetCode第 85 题:最大矩形(C++)

85. 最大矩形 - 力扣(LeetCode) 和LeetCode第 84 题:柱状图中最大的矩形(C++)_zj-优快云博客题类似,将每一行都看作一个柱形图: 第一层柱状图的高度["1","0","1","0","0"],最大面积为1; 第二层柱状图的高度["2","0","2","1","1"],最大面积为3; 第三层柱状图的高度["3","1","3","2","2"],最大面积为6; 第四层柱状图的高度["4","0","0","3","0"],最大面积为4; 然后套用84题的计算方法:

zj 1076

leetcode 85 最大矩形

暴力解法 https://leetcode-cn.com/problems/maximal-rectangle/ 遍历数组,让每个点作为数组右下角元素时,然后求面积。 第一步,先求宽度为1时的长度len。计算此时的矩阵面积maxSize。 第二步,宽度加1,计算上一行的长度tlen。若tlen为0,则跳出。若非0,此时宽度为2的矩阵长度为min(len, tlen)。计算此时的矩阵面积maxSize = max(maxSize, min(len, tlen) * hei) 一直重复步骤二直至跳出循环

qq_52993545的博客 255

LeetCode--85.最大矩形(单调栈)

最大矩形(单调栈)1. 题目描述2. 题目分析3. C语言实现 1. 题目描述 难度:困难 2. 题目分析 这道题目似曾相识啊,最大矩形面积的问题我们在LeetCode84.柱状图中最大的矩形也遇到过类似的问题,在84题中,我们应用了单调栈的方法,实现了O(n)的时间复杂度。在这一题中,我们可以将每一层都看做一个输入,比如第一层可以看做84题中的输入[1, 0, 1, 0, 0],这一层的最大矩...

魔法师の屋子★↓☆ 4261

LeetCode 85 最大矩形

LeetCode 85 最大矩形 题目链接 给定一个仅包含 0 和 1 、大小为 rows x 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 解释:最大矩形如上图所示。 示例 2: 输入:matrix = [] 输出:0 示例 3: 输入:matrix

旺崽的博客 1987

leetcode 85:最大矩形

leetcode 85:最大矩形 85. 最大矩形 给定一个仅包含 0 和 1 、大小为 rows x 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 解释:最大矩形如上图所示。 示例 2: 输入:matrix = [] 输出:0 示例

yingmu__的博客 332

85. 最大矩形 - 力扣(LeetCode)

题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例: 输入: [ [“1”,“0”,“1”,“0”,“0”], [“1”,“0”,“1”,“1”,“1”], [“1”,“1”,“1”,“1”,“1”], [“1”,“0”,“0”,“1”,“0”] ] 输出: 6 题解1 dp[i][j]表示从左边到(i, j)处连续1的个数。它应该满足式1 d...

Onwaier的博客 751
上一篇: Leetcode. 212 单词搜索II
下一篇: Leetcode. 739 每日温度
耐利
博客等级 码龄12年 188粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值