Problem:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
数组heits记录同一行中'1'的高度。如果'1'增长,就把行号压栈,因为面积在增大;如果'1'缩短,就把行号退栈,在面积缩小之前计算矩形的面积。
Solution:
public class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0].length==0)
return 0;
int rows = matrix.length;
int columns = matrix[0].length;
int[] heits = new int[columns+1];
int max = 0;
for(int i=0;i<rows;i++)
{
Stack<Integer> st = new Stack<>();
for(int j=0;j<=columns;j++)
{
if(j<columns&&matrix[i][j]=='1')
heits[j]++;
else
heits[j] = 0;
if(st.isEmpty()||heits[st.peek()]<=heits[j])
st.push(j);
else
{
int tmp = st.peek();
while(!st.isEmpty()&&heits[st.peek()]>heits[j])
{
int h = Math.min(heits[tmp], heits[st.pop()]);
int area = (st.empty()?j:(j-st.peek()-1))*h;
if(area>max)
max = area;
}
st.push(j);
}
}
}
return max;
}
}