原题链接:link
题意:给定一个只包含0, 1的矩阵,然我们找出只包含1的最大矩阵,并求出面积。
思路:此题我们可以利用求柱状图中最大矩形的方法(Leetcode 84),先遍历某一行 i,以第i行为底边,向上延伸,便构成了一个直方图,那么我们可以调用求柱状图中最大矩形的函数求出每一行矩形的最大值,然后再取个max。
那么我们怎么向上延伸呢?定义dp[i]上一行的直方图的高度。那么如果当前 matrix[i][j] == 1 则dp[i] = dp[i] + 1, 否则dp[i] = 0
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int res=0, n = heights.size();
stack<int> s;
vector<int> left(n), right(n, n);
for(int i=0;i<n;i++)
{
while(!s.empty()&&heights[s.top()]>=heights[i])
{
right[s.top()] = i;
s.pop();
}
left[i] = s.empty()?-1:s.top();
s.push(i);
}
for(int i=0;i<n;i++)
{
res = max(res, (right[i]-left[i]-1)*heights[i]);
}
return res;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(!matrix.size()) return 0;
int n = matrix.size(), m = matrix[0].size();
vector<int> dp(m, 0);
int res = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
dp[j] = matrix[i][j]=='1'?dp[j]+1 : 0;
}
res = max(res, largestRectangleArea(dp));
}
return res;
}
};