这道题和84题很像,如果把这个矩阵也画成类似直方图的形式,则有一些方块会“凌空”,用一条平行于x轴的横线截断,只考虑其上方的最大矩形,若方块“凌空”则认为高度是0,则这道题可以直接采用84题的解法来做:
class Solution {
public:
int max_rectangle_in_hist(vector<int> heights)
{
int ans=0;
stack<int> st;
if(heights.empty())
return ans;
st.push(0);
heights.push_back(0);
for(int i=1;i<heights.size();i++)
{
if(st.empty()||heights[i]>=heights[st.top()])
st.push(i);
else
{
int peak=heights[st.top()];
st.pop();
ans=max(ans,peak*(st.empty()?i:(i-st.top()-1)));
i--;
}
}
return ans;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int res=0;
int m=matrix.size();
if(m==0)
return 0;
int n=matrix[0].size();
if(n==0)
return 0;
vector<int> hist(n,0);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]=='0')
hist[j]=0;
else
hist[j]+=1;
}
res=max(res,max_rectangle_in_hist(hist));
}
return res;
}
};