求解最大矩形问题小结–1
在矩阵中求解最大矩形,一般而言可将矩阵转化为直方图求解。即以任意一行为底的直方图。然后求解每个直方图中的所有矩形的面积,则所有直方图中的所有矩形中面积最大的一个即为二维矩阵中矩形的最大面积。
例题1
leetcode85
代码描述:
class Solution {
public int maximalRectangle(char[][] matrix) {
//将问题转化为直方图解决
int m=matrix.length;
if(m==0) return 0;
int n=matrix[0].length;
if(n==0) return 0;
int[][] his=new int[m][n]; //初始化默认为0
for(int i=0;i<n;i++) {
if(matrix[0][i]=='1') his[0][i]=1;
}
for(int i=1;i<m;i++) {
for(int j=0;j<n;j++) {
if(matrix[i][j]=='1') his[i][j]=his[i-1][j]+1;
}
}
int ret=0;
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
int min=Integer.MAX_VALUE;
for(int k=j;k<n;k++) {
if(his[i][k]<min) {
min=his[i][k];
}
ret=Math.max(ret, min*(k-j+1));
if(min==0) break; //之后的面积均为0
}
}
}
return ret;
}
}
例题2
此题与上一题的唯一不同即每行的直方图中的每一柱可以任意交换顺序
leetcode5655
class Solution {
public int largestSubmatrix(int[][] matrix) {
int m=matrix.length;
int n=matrix[0].length;
for(int i=1;i<m;i++) {
for(int j=0;j<n;j++) {
if(matrix[i][j]==1) matrix[i][j]=matrix[i-1][j]+1;
}
}
int ret=0;
for(int i=0;i<m;i++) {
Arrays.sort(matrix[i]);
for(int j=0;j<n;j++) {
ret=Math.max(ret, matrix[i][j]*(n-j));
//System.out.print(matrix[i][j]);
}
//System.out.println();
}
return ret;
}
}