求最大子矩阵的大小
给定一个仅包含 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的数量
构造高度数组height来表示
2.每当得到一个height数组之后都求一次最大矩形面积,再逐行比较
3.通过height数组求面积时,使用栈结构
代码
package Main;
import java.util.Stack;
public class Main {
public static int maxRecFromBottom(int[] height) {
if (height == null || height.length == 0) {
return 0;
}
int maxArea = 0;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < height.length; i++) {
while (!stack.isEmpty() && height[i] <= height[stack.peek()]) { //如果当前height的值小于栈顶的值,说明当前栈顶的元素只能向左扩展;若是等于的话,则等i弹出的时候计算即可
int j = stack.pop();
int k = stack.isEmpty() ? -1 : stack.peek();
int curArea = (i - k - 1) * height[j]; // i-1-(k+1)+1
maxArea = Math.max(maxArea, curArea);
}
stack.push(i);
}
while (!stack.empty()) {
int j = stack.pop();
int k = stack.isEmpty() ? -1 : stack.peek();
int curArea = (j - k - 1) * height[j];
maxArea = Math.max(maxArea, curArea);
}
return maxArea;
}
public static int maxRecSize(int[][] map) {
if (map == null || map.length == 0 || map[0].length == 0) {
return 0;
}
int maxArea = 0;
int[] height = new int[map[0].length];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
height[j] = map[i][j] == 0 ? 0 : height[j] + 1; //不连续则为0 连续则为上层+1
}
maxArea = Math.max(maxArea, maxRecFromBottom(height));
}
return maxArea;
}
}
这是从左程云左神的书上所学的知识的总结。才疏学浅,若有错误欢迎大家多多提出,定虚心接受。