leetcode 85. 最大矩形
问题描述
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
代码1
从下图可以看出这题是84. 柱状图中最大的矩形的推广,一个技巧是从上开始计算层数,这样rect可以由上一层的rect直接推出:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m = matrix.size();
if(m == 0)return 0;
int n = matrix[0].size(),i,j;
int ans = 0;
vector<int> rect(n,0);
for(i = 0; i < m; ++i)
{
for(j = 0; j < n; ++j)
{
rect[j] = matrix[i][j] == '0'?0:++rect[j];
}
ans = max(ans,findmaximalRect(rect));
}
return ans;
}
int findmaximalRect(vector<int> &rect)
{
int n = rect.size(),maxarea = 0,i;
stack<int> st;
for(i = 0; i < n; ++i)
{
while(!st.empty() && st.top()>= rect[i])
{
int cur = st.top();
st.pop();
maxarea = max(maxarea,rect[cur]*(st.empty()?i:i-st.top()-1));
}
st.push(i);
}
return maxarea;
}
};
结果:
执行用时 :24 ms, 在所有 C++ 提交中击败了75.81%的用户
内存消耗 :11.7 MB, 在所有 C++ 提交中击败了19.61%的用户
还有一种直接遍历的解法,没有想明白,留待后面补充。