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.
方法是通过Leetcode-Largest Rectangle in Histogram,去完成。
其实把有1,看作是是一个高度,0看作是没有高度,从第一行开始,对每一行都采用Largest Rectangle in Histogram,就达到了目的。其中主要是要注意更新每一行往上的height表。
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix)
{
if(matrix.size() == 0 || matrix[0].size() == 0)
return 0;
int res = 0;
vector<int> height(matrix[0].size(), 0);
for(int i = 0; i < matrix.size(); ++ i)
{
for(int j = 0; j < matrix[0].size(); ++ j)
height[j] = matrix[i][j] == '0' ? 0 : height[j] + 1;
res = max(res, largestRectangleArea(height));
}
return res;
}
int largestRectangleArea(vector<int> &height) {
int ret = 0;
height.push_back(0);
vector<int> index;
for (int i = 0; i < height.size(); i++)
{
while (index.size() > 0 && height[index.back()] >= height[i])
{
int h = height[index.back()];
index.pop_back();
int sidx = index.size() > 0 ? index.back() : -1;
if (h * (i - sidx - 1) > ret)
ret = h * (i - sidx - 1);
}
index.push_back(i);
}
return ret;
}
};