题目:
Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing all ones and return its area.
思路:(参考网上博文)
将该题转换成上一题Largest Rectangle in Histogram。
转换:
public class Solution {
public int largestRectangleArea(int[] heights) {
if(heights.length == 0){return 0;}
int[] hs = new int[heights.length+1];
for(int i =0;i<heights.length;i++){hs[i] = heights[i];}
hs[heights.length] = 0;
int maxArea = Integer.MIN_VALUE;
Stack<Integer> stack = new Stack<>();
int i = 0;
while(i<hs.length)
{
//int top = stack.peek();
if(stack.isEmpty() || hs[i]>=hs[stack.peek()])
{
stack.push(i++);
}else
{
int top = stack.pop();
maxArea = Math.max(maxArea, (stack.isEmpty()?i:i-stack.peek()-1)*hs[top]);
}
}
return maxArea;
}
public int maximalRectangle(char[][] matrix) {
int m = matrix.length;
if(m == 0) return 0;
int n = matrix[0].length;
int[][] dp = new int[m][n];
for(int j =0;j<n;j++){dp[0][j] = matrix[0][j] - '0';}
for(int i=1;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j] == '0'){dp[i][j] = 0;}
else
{
dp[i][j] = dp[i-1][j]+1;
}
}
}
int maxArea = 0;
for(int i=0;i<m;i++)
{
maxArea = Math.max(maxArea, largestRectangleArea(dp[i]));
}
return maxArea;
}
}