题目链接

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

解题思路

第一步

我们把矩形横向定义为长,纵向定义为宽。

计算出每一点向右画,最远能画到多少。

换句话说,我们求出每一点宽为1的时候,长最大是多少。

例如对于样例中的输入,我们的计算结果是

1 0 1 0 0 
1 0 3 2 1 
5 4 3 2 1 
1 0 0 1 0

再给一个样例

{{'1','1','1','1','1','1','1','1'},
{'1','1','1','1','1','1','1','0'},
{'1','1','1','1','1','1','1','0'},
{'1','1','1','1','1','0','0','0'},
{'0','1','1','1','1','0','0','0'}}

对于这个样例,我们的计算结果是

8 7 6 5 4 3 2 1 
7 6 5 4 3 2 1 0 
7 6 5 4 3 2 1 0 
5 4 3 2 1 0 0 0 
0 4 3 2 1 0 0 0

第二步

根据第一步计算结果计算最大矩形。

这里面有一个木桶原理,木桶能装多少水,取决于木桶的最短板。

对于每一个点,我们只考虑向右和向下的方向。第一步计算出了向右方向——最大的长。

接下来,我们开始向下扩展,每向下扩展一行,宽就要+1,长就会变成扩展的k行里面的最小值,面积就要动态变化,这样就可以找到每个点的面积最大值。

最后再找到全局最大值。

解题代码

class Solution {public int maximalRectangle(char[][] matrix) {int m = matrix.length;if (m == 0) {return 0;}int n = matrix[0].length;int[][] l = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == '0') {l[i][j] = 0;continue;}int index = j + 1;while (index < n && matrix[i][index] == '1') {index++;}l[i][j] = index - j;}}int maxS = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {//遍历每个点,以该点为左上角if (l[i][j] == 0) {continue;}int s = l[i][j];for (int k = 1; k < m - i && matrix[i + k][j] != '0'; k++) {int minL = l[i][j];// 找到 由i到i+k的最小值for (int t = i + 1; t <= i + k; t++) {if (minL >= l[t][j]) {minL = l[t][j];}}//当前点为左上角,面积所能达到的最大值s = Math.max((k + 1) * minL, s);}maxS = Math.max(maxS, s);}}return maxS;}}

测试代码

public static void main(String[] args) {Solution s = new Solution();char[][] b = { { '1', '0', '1', '0', '0' }, { '1', '0', '1', '1', '1' },{ '1', '1', '1', '1', '1' },{ '1', '0', '0', '1', '0' } };char[][] b1 = { { '1', '1', '1', '1', '1', '1', '1', '1' },{ '1', '1', '1', '1', '1', '1', '1', '0' },{ '1', '1', '1', '1', '1', '1', '1', '0' }, { '1', '1', '1', '1', '1', '0', '0', '0' },{ '0', '1', '1', '1', '1', '0', '0', '0' } };System.out.println(s.maximalRectangle(b1));System.out.println(s.maximalRectangle(b));}

测试结果:

21

6

解题结果

66 / 66 个通过测试用例

状态:

通过

执行用时:42 ms

LeetCode:85. 最大矩形相关推荐

  1. java 最大矩形_Java实现 LeetCode 85 最大矩形

    85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1 ...

  2. LeetCode 85. 最大矩形(DP/单调递增栈,难)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...

  3. 2021-06-17Leetcode84.柱状图中最大的矩形 Leetcode.85最大矩形

    以任意一个矩形为高,只要找出最大的宽即可,这个宽是由其两侧第一个比它小的数字组成 1.1我的解法--暴力解法 以每个矩形为中心向两边扩散,分别在两边找到比它小的第一个数字,分别求出这两块 面积,然后加 ...

  4. leetcode 85. 最大矩形(dp)

    给定一个仅包含 0 和 1 .大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例 1: 输入:matrix = [["1",&quo ...

  5. LeetCode 85.最大矩形

    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [   ["1","0","1", ...

  6. 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形

    84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...

  7. 【DP】LeetCode 85. Maximal Rectangle

    LeetCode 85. Maximal Rectangle Solution1: 一语惊醒梦中人啊,参考链接:https://www.youtube.com/watch?v=2Yk3Avrzauk ...

  8. leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

    题目 https://leetcode.com/problems/maximal-rectangle/ 题解 本题与 leetcode 84. Largest Rectangle in Histogr ...

  9. 【LeetCode笔记】85. 最大矩形(Java、单调栈)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 其实是84. 柱状图中最大的矩形的兄弟题目,理解成多个84题,对结果取max即可. 思路 && 代码 一行抽象出一 ...

最新文章

  1. Binder相关面试总结(四):一次Binder通信的基本流程是什么样?
  2. 【深度学习笔记】分类指标accuracy,recall,precision等的区别
  3. (四)协同过滤算法之基于用户的推荐算法python实现
  4. 微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...
  5. oatdata结构详解
  6. HTML的块级元素和行级元素的标签列表
  7. npm error enoent:no such file or directory...are-we-there-yet ; package.json文件和node_modules模相互转化
  8. Java操作Excel中HSSFCell.CELL_TYPE_STRING、BOOLEAN、NUMERIC无定义解决方法
  9. Maven项目有红叉,文件却没有错误,已解决
  10. android修改HOLO对话框风格
  11. 笔记本内置键盘的外接改造(上篇)
  12. 浏览器主页被篡改劫持怎么办
  13. 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?手把手教你解决方法...
  14. LOW逼三人组(三)----插入排序
  15. Mock测试-优缺点分析
  16. word 表格内容不能自动延续到下一页
  17. 手机短信真的可信吗# 传统短信伪造攻击的可能性证明
  18. cef异常处理_cef js异常
  19. ubuntu10.04换官方源
  20. Unity项目接收不到android的KeyEvent的解决办法

热门文章

  1. C语言strncmp()函数(把 str1 和 str2 进行比较,最多比较前 n 个字节)
  2. ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(1)
  3. IDEA 2020.1打开时闪退的问题及解决方法
  4. Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...
  5. Java中获取近七天的日期(包含今天)
  6. 「后端小伙伴来学前端了」CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子
  7. 自动化工程师与python_软件测试自动化工程师用案例带你进入Python数据类型,数据结构等代码实现...
  8. 注册oracle驱动,注册设备 ID - 编写适用于 Oracle® Solaris 11.2 的设备驱动程序
  9. ps清理缓存脚本_清理垃圾脚本,让你的电脑丝滑如新!
  10. 计算机操作业务知识题库,《计算机操作基础知识题库》.doc