Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 6.
此题应该与前一道题“Largest Rectangle in Histogram”连起来看,这也是leetcode上两道题挨着的原因
看这个矩阵,是不是就像前一道题求最大矩阵面积。
代码如下,一看即懂:
class Solution {
public:
int maximalRectangle(vector<vector<char> >& matrix) {
int row = matrix.size();
int col = matrix[0].size();
if(row == 0 || col == 0)
return 0;
vector<vector<int> >area(row, vector<int>(col, 0));
int i, j, max = 0, tmp;
for(j=0; j<col; ++j)
if(matrix[0][j] == '1')
area[0][j] = 1;
for(i=1; i<row; ++i)
for(j=0; j<col; ++j)
if(matrix[i][j] == '1')
area[i][j] = area[i-1][j] + 1;
for(i=0; i<row; ++i)
{
tmp = largestRectangleArea(area[i]);
if(tmp > max)
max = tmp;
}
return max;
}
int largestRectangleArea(vector<int> &height) {//<span style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">前一道题“</span><a target=_blank target="_blank" href="https://leetcode.com/problems/largest-rectangle-in-histogram/" style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(0, 136, 204); text-decoration: none; line-height: 20px;">Largest Rectangle in Histogram</a><span style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">”的代码</span>
if(height.empty())
return 0;
height.push_back(0);
stack<int> s;
int len = height.size() ,tmp;
int leftarea, rightarea, max = 0;
for(int i=0; i<len; ++i)
{
while(!s.empty() && height[s.top()] > height[i])
{
tmp = s.top();
s.pop();
if(s.empty())
leftarea = (tmp+1)*height[tmp];
else
leftarea = (tmp-s.top())*height[tmp];
rightarea = (i-tmp-1)*height[tmp];
if(leftarea + rightarea > max)
max = leftarea + rightarea;
}
s.push(i);
}
return max;
}
};