这道题跟最大子矩阵的思想比较类似,都是降一维(减少变量数量)转化成简单问题
指定任意一行作为矩形的下边界,那么问题就变成了求直方图的最大面积的矩形,参见之前的这篇文章。
所以思路就是,从上到下,依次求直方图最大面积矩形,感觉瞬间没有难度了。下面的代码里,第一个函数就是原封不动搬过来的。。
时间复杂度是O(n^2)
代码:
1 int largestRectangleArea(vector<int> &height) { 2 int maxArea = 0; 3 int n = height.size(); 4 stack<int> st; 5 int h, w; 6 7 for (int i = 0; i < n; i++) { 8 if (st.empty() || height[st.top()] < height[i]) 9 st.push(i); 10 else { 11 while (!st.empty() && height[st.top()] > height[i]) { 12 h = height[st.top()]; 13 st.pop(); 14 w = st.empty() ? i : i - (st.top() + 1); 15 maxArea = max(maxArea, h * w); 16 } 17 st.push(i); 18 } 19 } 20 21 return maxArea; 22 } 23 24 int maximalRectangle(vector<vector<char> > &matrix) { 25 if (matrix.empty() || matrix[0].empty()) 26 return 0; 27 28 int maxArea = 0; 29 int h = matrix.size(); 30 int w = matrix[0].size(); 31 vector<int> histo(w + 1, 0); // 在末尾增加一个0起收割作用 32 33 for (int i = 0; i < h; i++) { 34 // 计算直方图 35 for (int j = 0; j < w; j++) 36 histo[j] = (histo[j] + 1) * (matrix[i][j] - '0'); 37 38 maxArea = max(maxArea, largestRectangleArea(histo)); 39 } 40 41 return maxArea; 42 }