(每日算法)Leetcode --- Maximal Rectangle(最大子矩阵)
求在0-1矩阵中找出面积最大的全1矩阵
Given a 2D binary matrix filled with 0‘s and 1‘s, find the largest rectangle containing all ones and return its area.
首先,想使用遍历两次的暴力方法解决是不靠谱的,先打消这个念头。
这道题的解法灵感来自于 Largest Rectangle in Histogram
这道题,假设我们把矩阵沿着某一行切下来,然后把切的行作为底面,将自底面往上的矩阵看成一个直方图。这样就能转化为使用我们解决的问题来解决新的问题。直方图的中每个项的高度就是从底面行开始往上1的数量。
我们只需要构造一个一唯的矩阵存储,以当前行为底的柱状图就可以。在第一次的时候只考虑第一行,在第二次的时候查看第二行的元素,如果是0
,那么当前一唯矩阵置为0
,否则加1
。
class Solution {
public:
int largestRectangleArea(vector<int> &h) {
stack<int> S;
h.push_back(0);
int sum = 0;
for (int i = 0; i < h.size(); i++) {
if (S.empty() || h[i] > h[S.top()]) S.push(i);
else {
int tmp = S.top();
S.pop();
sum = max(sum, h[tmp]*(S.empty()? i : i-S.top()-1));
i--;
}
}
return sum;
}
int maximalRectangle(vector<vector<char> > &matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0)
return 0;
int maxArea = 0;
vector<int> temp(matrix[0].size(), 0);//用来调用辅助函数的参数向量
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[0].size(); j++){ //在每一行都重置辅助向量
if(matrix[i][j] == ‘1‘)
temp[j]++;
else
temp[j] = 0; //断开了,就置零
}
int ret = largestRectangleArea(temp);
maxArea = ret > maxArea ? ret : maxArea;
}
return maxArea;
}
};
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。