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