LeetCode: Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
地址:https://oj.leetcode.com/problems/maximal-rectangle/
算法:要解决这道题,得利用Largest Rectangle in Histogram这道题的解法。我们把矩阵的每一行都看成histogram's bar的底,比如第i行可以看成从最后一行到第i行之间的histogram,并且每一列的高度为在该列上从i行开始向下数连续为1的行数。这样以第i行为矩阵的上面一条边的最大矩阵的值即为这个histogram中最大的矩阵面积。也就是说对于没一个行,我们都可以计算出该行所代表的histogram,然后调用Largest Rectangle in Histogram里面的函数就可以找出以该行为上边的最大矩阵,然后从所有行中找到整个问题的最大矩阵。代码:
1 class Solution {
2 public:
3 int maximalRectangle(vector<vector<char> > &matrix) {
4 if(matrix.empty() || matrix[0].empty()) return 0;
5 int row_num = matrix.size();
6 int col_num = matrix[0].size();
7 vector<int> histogram1(col_num), histogram2(col_num);
8 for(int j = 0; j < col_num; ++j){
9 histogram1[j] = matrix[row_num-1][j] - '0';
10 }
11 int max_area = largestRectangleArea(histogram1);
12 vector<int> *p_now = &histogram2;
13 vector<int> *p_pre = &histogram1;
14 for(int i = row_num-2; i >= 0; --i){
15 for(int j = 0; j < col_num; ++j){
16 if(matrix[i][j] == '0'){
17 (*p_now)[j] = 0;
18 }else if(matrix[i+1][j] == matrix[i][j]){
19 (*p_now)[j] = (*p_pre)[j] + 1;
20 }else{
21 (*p_now)[j] = 1;
22 }
23 }
24 int area = largestRectangleArea(*p_now);
25 if(area > max_area)
26 max_area = area;
27 vector<int> *temp = p_now;
28 p_now = p_pre;
29 p_pre = temp;
30 }
31 return max_area;
32 }
33 int largestRectangleArea(vector<int> &height) {
34 int len = height.size();
35 if(len < 1) return 0;
36 stack<int> stk;
37 int i = 0;
38 int max_area = 0;
39 while(i < len){
40 if(stk.empty() || height[stk.top()] <= height[i]){
41 stk.push(i++);
42 }else{
43 int t = stk.top();
44 stk.pop();
45 int area = height[t] * (stk.empty() ? i : i - stk.top() - 1);
46 if(area > max_area){
47 max_area = area;
48 }
49 }
50 }
51 while(!stk.empty()){
52 int t = stk.top();
53 stk.pop();
54 int area = height[t] * (stk.empty() ? len : len - stk.top() - 1);
55 if(area > max_area){
56 max_area = area;
57 }
58 }
59 return max_area;
60 }
61 };