给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
解释:最大矩形如上图所示。
示例 2:
输入:matrix = []
输出:0
示例 3:
输入:matrix = [[“0”]]
输出:0
示例 4:
输入:matrix = [[“1”]]
输出:1
示例 5:
输入:matrix = [[“0”,“0”]]
输出:0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:我们可以把每一列的1个数当做是其高度,那么根据前一题84. 柱状图中最大的矩形,我们可以将每一层看作是柱状图,可以套用84题柱状图的最大面积。
第一层柱状图的高度[“1”,“0”,“1”,“0”,“0”],最大面积为1;
第二层柱状图的高度[“2”,“0”,“2”,“1”,“1”],最大面积为3;
第三层柱状图的高度[“3”,“1”,“3”,“2”,“2”],最大面积为6;
第四层柱状图的高度[“4”,“0”,“0”,“3”,“0”],最大面积为4;
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int rows = matrix.size();
if(rows == 0)
return 0;
int colums = matrix[0].size();
if(colums == 0)
return 0;
int ans = 0;
vector<int>f(colums+2,0);
for(int i = 0;i < rows;++i)
{
for(int j = 0;j < colums;++j)
{
if(matrix[i][j] == '1')
{
f[j+1] = f[j+1] + 1;
}
else
{
f[j+1] = 0;//当前为0断层 不能构成矩形了
}
}
ans = max(largestRectangleArea(f),ans);
}
return ans;
}
int largestRectangleArea(vector<int>& heights) {
vector<int>temp;
temp.push_back(0);
for(auto c:heights)
{
temp.push_back(c);
}
temp.push_back(0);
stack<pair<int,int>>s;
int ans = 0;
for(int i = temp.size()-1;i >=0;--i)
{
while(!s.empty() && temp[i] < s.top().first)//找到了比当前柱子矮的柱子
{
int h = s.top().first;//注意这里
s.pop();
ans = max(ans,(s.top().second - i - 1) * h);//注意底要再减去1
}
s.push(make_pair(temp[i],i));
}
return ans;
}
};