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; } };