leetcode 85. 最大矩形 hard
题目描述:
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
解题思路:
leetcode 84的衍生题,按行来,每行单调栈计算直方图的最大面积
代码:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty() || matrix[0].empty())
return 0;
int res=0;
// 按行来,用单调栈计算直方图的最大面积
vector<int> vec(matrix[0].size(),0);
for(int i=0;i<matrix.size();++i){
for(int j=0;j<vec.size();++j){
vec[j]= matrix[i][j]=='1'?vec[j]+1:0;
}
res = max(res,core(vec));
}
return res;
}
// 用单调栈计算直方图的最大面积
int core(const vector<int> & vec){
int res=0;
stack<int> stk;
for(int i=0;i<vec.size();++i){
while(stk.size() && vec[i]<=vec[stk.top()]){
int index=stk.top();
stk.pop();
int end=i;
int start=stk.empty()?-1:stk.top();
int area=(end-start-1)*vec[index];
res= max(res,area);
}
stk.push(i);
}
int end=vec.size();
while(stk.size()){
int index=stk.top();
stk.pop();
int start=stk.empty()?-1:stk.top();
int area=(end-start-1)*vec[index];
res= max(res,area);
}
return res;
}
};