题目:
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路:
思路和上一题84基本是一样的,只不过这里的矩形条高度有很多组,dp数组每一次更新就是一个矩形条高度的数组。dp数组记录的是下一层相对于上一层,每个方块能达到的最大高度。所以要对求出的每一个dp数组分别求出最大矩形的高度。
代码:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(!matrix.size()) return 0;
vector<int> dp(matrix[0].size(),0);//dp用于记录以某一层为底,与之前的所有上层可以形成的连续高度
int maxArea = 0;
/*
循环中调用amxRectangleArea()算法,
用于找到在一层中结点matrix[i][j]完整包含dp[j]高度的最大宽度
面积就等于找到的长 * 宽
*/
for(int i=0;i<matrix.size();++i)
{
for(int j=0;j<matrix[0].size();++j)
{
dp[j] = (matrix[i][j]=='1') ? dp[j]+1 : 0;
}
maxArea=max(maxArea,maxRectangleArea(dp));
}
return maxArea;
}
private:
//84.柱状图中最大的矩形 的代码,
//用于找到nums中完整包含当前高度的最长宽度
int maxRectangleArea(vector<int> &nums)
{
stack<int> s;//单调栈
nums.push_back(0);//设置一个哨兵,让nums遍历到最后时,获得的柱体高度可让单调栈前面的所有元素出栈
int maxArea = 0;
for(int i=0;i<nums.size();++i)
{
while(!s.empty() && nums[i]<=nums[s.top()])
{
int top = s.top();s.pop();
maxArea = max(maxArea,nums[top]*(s.empty()?i:i-s.top()-1));
}
s.push(i);
}
nums.pop_back();
return maxArea;
}
};