LeetCode:85. 最大矩形
题目链接
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. 最大矩形相关推荐
- java 最大矩形_Java实现 LeetCode 85 最大矩形
85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1 ...
- LeetCode 85. 最大矩形(DP/单调递增栈,难)
文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...
- 2021-06-17Leetcode84.柱状图中最大的矩形 Leetcode.85最大矩形
以任意一个矩形为高,只要找出最大的宽即可,这个宽是由其两侧第一个比它小的数字组成 1.1我的解法--暴力解法 以每个矩形为中心向两边扩散,分别在两边找到比它小的第一个数字,分别求出这两块 面积,然后加 ...
- leetcode 85. 最大矩形(dp)
给定一个仅包含 0 和 1 .大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例 1: 输入:matrix = [["1",&quo ...
- LeetCode 85.最大矩形
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1", ...
- 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形
84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...
- 【DP】LeetCode 85. Maximal Rectangle
LeetCode 85. Maximal Rectangle Solution1: 一语惊醒梦中人啊,参考链接:https://www.youtube.com/watch?v=2Yk3Avrzauk ...
- leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)
题目 https://leetcode.com/problems/maximal-rectangle/ 题解 本题与 leetcode 84. Largest Rectangle in Histogr ...
- 【LeetCode笔记】85. 最大矩形(Java、单调栈)
文章目录 题目描述 思路 && 代码 二刷 题目描述 其实是84. 柱状图中最大的矩形的兄弟题目,理解成多个84题,对结果取max即可. 思路 && 代码 一行抽象出一 ...
最新文章
- Binder相关面试总结(四):一次Binder通信的基本流程是什么样?
- 【深度学习笔记】分类指标accuracy,recall,precision等的区别
- (四)协同过滤算法之基于用户的推荐算法python实现
- 微服务接入oauth2_微服务权限终极解决方案,Spring Cloud Gateway+Oauth2实现统一认证和鉴权!...
- oatdata结构详解
- HTML的块级元素和行级元素的标签列表
- npm error enoent:no such file or directory...are-we-there-yet ; package.json文件和node_modules模相互转化
- Java操作Excel中HSSFCell.CELL_TYPE_STRING、BOOLEAN、NUMERIC无定义解决方法
- Maven项目有红叉,文件却没有错误,已解决
- android修改HOLO对话框风格
- 笔记本内置键盘的外接改造(上篇)
- 浏览器主页被篡改劫持怎么办
- 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?手把手教你解决方法...
- LOW逼三人组(三)----插入排序
- Mock测试-优缺点分析
- word 表格内容不能自动延续到下一页
- 手机短信真的可信吗# 传统短信伪造攻击的可能性证明
- cef异常处理_cef js异常
- ubuntu10.04换官方源
- Unity项目接收不到android的KeyEvent的解决办法
热门文章
- C语言strncmp()函数(把 str1 和 str2 进行比较,最多比较前 n 个字节)
- ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo下Moveit运动规划仿真以及真实UR3机械臂的运动控制(1)
- IDEA 2020.1打开时闪退的问题及解决方法
- Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...
- Java中获取近七天的日期(包含今天)
- 「后端小伙伴来学前端了」CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子
- 自动化工程师与python_软件测试自动化工程师用案例带你进入Python数据类型,数据结构等代码实现...
- 注册oracle驱动,注册设备 ID - 
编写适用于 Oracle® Solaris 11.2 的设备驱动程序
- ps清理缓存脚本_清理垃圾脚本,让你的电脑丝滑如新!
- 计算机操作业务知识题库,《计算机操作基础知识题库》.doc