给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
输出: 6
通常对于数组求最大或最小值等问题,最简单的方法是暴力遍历,但是这通常会超时,如果做过leetcode84的话,这道题应该会很好解决,这就是矩形说白了就是多个柱状图的组合,因此,我们可以把它分解成多个柱状图来做,对每一层计算出高度,带入求矩形的公式中即可。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m=matrix.size();
if(m==0)return 0;
int n=matrix[0].size();
vector<int>heights(n,0);
int res=0;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(matrix[i][j]=='1'){
heights[j]++;
}
else{
heights[j]=0;
}
}
res=max(res,largestRectangleArea(heights));
}
return res;
}
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(),0);
heights.push_back(0);
int len=heights.size();
stack<int>st;
int res=0;
for(int i=0;i<len;++i){
while(!st.empty() && heights[st.top()]>heights[i]){
int cur=st.top();
st.pop();
int left=st.top()+1;
int right=i-1;
res=max(res,heights[cur]*(right-left+1));
}
st.push(i);
}
heights.pop_back();
heights.erase(heights.begin());
return res;
}
};
除此之外可以使用前缀和计算,其原理和leetcode221.最大正方形相同,只是更加泛化。
int maximalRectangle(vector<vector<char>>& matrix){
int m=matrix.size();
if(m==0)return 0;
int n=matrix[0].size();
vector<vector<int>>sum(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
sum[i][j]=matrix[i-1][j-1]-'0';
}
}
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
sum[i][j]+=sum[i][j-1];
}
}
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
sum[i][j]+=sum[i-1][j];
}
}
int res=0;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
for(int len1=1;len1+i-1<=m;++len1){
for(int len2=1;len2+j-1<=n;++len2){
if(getArea(sum,i,j,len1,len2)==len1*len2)res=max(res,len1*len2);
else break;
}
}
}
}
return res;
}
int getArea(vector<vector<int>>& sum,int x0,int y0,int len1,int len2){
int x1=x0+len1-1,y1=y0+len2-1;
return sum[x1][y1]-sum[x1][y0-1]-sum[x0-1][y1]+sum[x0-1][y0-1];
}
本文探讨了在二维二进制矩阵中寻找只包含1的最大矩形问题,介绍了通过分解为多个柱状图来简化计算的方法,同时提供了两种实现思路:一是基于柱状图高度的动态更新与最大面积计算;二是利用前缀和方法,类似于求最大正方形问题的泛化。
409

被折叠的 条评论
为什么被折叠?



