最大矩形算法详解编程语言
2023-06-13 09:11:47 时间
给定一个仅包含 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 的矩形面积,也就是它自身的数,如图中橙色的 4,面积就是 4。
然后向上扩展一行,高度增加一,选出当前列最小的数字,作为矩阵的宽,求出面积,对应上图的矩形框。
然后继续向上扩展,重复步骤 2。
按照上边的方法,遍历所有的点,求出所有的矩阵就可以了。
以橙色的点为右下角,高度为 1。
高度为 2。
高度为 3。
作者的java代码,自己写的比较挫就不放上来了
public int maximalRectangle(char[][] matrix) { if (matrix.length == 0) { return 0; //保存以当前数字结尾的连续 1 的个数 int[][] width = new int[matrix.length][matrix[0].length]; int maxArea = 0; //遍历每一行 for (int row = 0; row matrix.length; row++) { for (int col = 0; col matrix[0].length; col++) { //更新 width if (matrix[row][col] == 1) { if (col == 0) { width[row][col] = 1; } else { width[row][col] = width[row][col - 1] + 1; } else { width[row][col] = 0; //记录所有行中最小的数 int minWidth = width[row][col]; //向上扩展行 for (int up_row = row; up_row = 0; up_row--) { int height = row - up_row + 1; //找最小的数作为矩阵的宽 minWidth = Math.min(minWidth, width[up_row][col]); //更新面积 maxArea = Math.max(maxArea, height * minWidth); return maxArea; }
17580.html
cjava相关文章
- Java基础系列–基础排序算法详解编程语言
- 弗洛伊德(Floyd)算法求图的最短路径详解编程语言
- Python算法:如何解决回文索引问题详解编程语言
- 数组元素随机化排序算法实现详解编程语言
- JAVA语言实现二叉树的层次遍历的非递归算法及递归算法详解编程语言
- Java版 微信红包算法详解编程语言
- java冒泡排序算法详解编程语言
- A星算法Java实现详解编程语言
- 算法-单链表的创建详解编程语言
- Java程序员必须掌握的8大排序算法详解编程语言
- Java数据结构和算法(十三)——哈希表详解编程语言
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序详解编程语言
- 算法-斐波那契数列详解编程语言
- 算法-和为S的连续正数序列详解编程语言
- 算法-翻转单词顺序列详解编程语言
- 算法-左旋转字符串详解编程语言
- 算法-对称的二叉树详解编程语言
- 算法-两个链表的第一个公共结点详解编程语言
- 算法-链表中倒数第k个结点详解编程语言
- Python 算法(2) 哈夫曼编码 Huffman Encoding详解编程语言
- java 根据经纬度坐标计算两点的距离算法详解编程语言
- 算法练习之相同的树,对称二叉树详解编程语言
- Sunday 字符串匹配算法(C++实现)详解编程语言