LeetCode-Maximal Rectangle-最大矩形
https://oj.leetcode.com/problems/maximal-rectangle/
一堆0,1矩阵中计算出由1组成的长方形的最大面积。
使用了直方图求最大面积的算法。枚举每一行p,然后在将一行上的所有列看做朝i>p方向出发的直方图,然后在这个直方图上用栈存储递增序列的那个一次遍历算法。最终求得最大值。
class Solution {
public:
int n,m;
vector<vector<char> > a;
vector <int> h;
int MaxArea(int p){
for (int i=0;i<m;i++){
h[i]=0;
for (int j=p;j<n;j++){
if (a[j][i]=='0') break;
h[i]++;
}
}
vector <int> l(m);
vector <int> r(m);
stack <int> st;
for (int i=0;i<m;i++){
if (st.empty()){
l[i]=i;
st.push(i);
continue;
}
if (h[i]>h[st.top()]){
l[i]=i;
st.push(i);
continue;
}
while(!st.empty()){
if (h[i]>h[st.top()]) break;
l[i]=l[st.top()];
st.pop();
}
st.push(i);
}
while(!st.empty()) st.pop();
for (int i=m-1;i>=0;i--){
if (st.empty()){
r[i]=i;
st.push(i);
continue;
}
if (h[i]>h[st.top()]){
r[i]=i;
st.push(i);
continue;
}
while(!st.empty()){
if (h[i]>h[st.top()]) break;
r[i]=r[st.top()];
st.pop();
}
st.push(i);
}
int res=0;
for (int i=0;i<m;i++){
res=max(res,(r[i]-l[i]+1)*h[i]);
}
return res;
}
int maximalRectangle(vector<vector<char> > &matrix) {
n=matrix.size();
a=matrix;
if (n==0){return 0;}
m=matrix[0].size();
int res=0;
h.resize(m);
for (int i=0;i<n;i++){
res=max(res,MaxArea(i));
}
return res;
}
};
浙公网安备 33010602011771号