
详细思路

对于遍历每一层并求出以该层为底的1的高度数组,看作是求 84:柱状图中最大的矩形,更新答案,继续遍历下一层
class Solution { public: int maximalRectangle(vector<vector<char>>& matrix) { int ans=-0x3f3f3f3f; int n=matrix.size(); if(n==0)return 0; int m=matrix[0].size(); vector<int>heights(m,0); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(matrix[i][j]=='1')heights[j]+=1; else heights[j]=0; } ans=max(ans,largestRectangleArea(heights)); } return ans; } int largestRectangleArea(vector<int>&heights){ int n=heights.size(); vector<int>left(n,-1); vector<int>right(n,n); stack<int>stk; stk.push(-1); for(int i=0;i<n;i++){ while(1){ if(stk.top()==-1){ left[i]=-1; stk.push(i); break; } else if(heights[stk.top()]>=heights[i]){ stk.pop(); } else if(heights[stk.top()]<heights[i]){ left[i]=stk.top(); stk.push(i); break; } } } stack<int>stk1; stk1.push(n); for(int i=n-1;i>=0;i--){ while(1){ if(stk1.top()==n){ right[i]=n; stk1.push(i); break; } else if(heights[stk1.top()]>=heights[i]){ stk1.pop(); } else if(heights[stk1.top()]<heights[i]){ right[i]=stk1.top(); stk1.push(i); break; } } } int ans=0; for(int i=0;i<n;i++){ int low=(right[i]-1)-(left[i]+1)+1; ans=max(ans,low*heights[i]); } return ans; } };
踩过的坑
一定要和上一题求柱形图最大矩形联系起来
浙公网安备 33010602011771号