leetcode 85. 最大矩形

题目描述:

给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

思路分析:

这题是之前那道最大正方形的进阶,同样是利用dp来求解。通过逐行去计算最大矩形,即优化的子结构是当前行的最大矩形,从1行到2行,最后到n行。需要利用三个数组来求矩形面积,首先是h,表示当前位置矩形的最大高度,l和r分别表示了当前位置可向左右延伸到多远。其中l数组存左边界,r数组存右边界,是一个左闭右开区间。当遇到‘1’时,需要更新左右边界,左边界的更新是l[i] = max(l[i], cur_left),这里的l[i]即上一行时在当前位置的左边界,cur_left则表示在当前行的左边界,以此来保证其延伸的区域不会低于当前位置的高度。右边界的更新为r[i] = min(r[i], cur_right),右边界需要从右往左。

代码:

 1 class Solution {
 2 public:
 3     int maximalRectangle(vector<vector<char>>& matrix) {
 4         int row = matrix.size();
 5         if(row == 0)
 6             return 0;
 7         int col = matrix[0].size();
 8         vector<int>l(col, 0);
 9         vector<int>r(col, col);
10         vector<int>h(col, 0);
11         int max_area = 0;
12         for(int i=0; i<row; i++)
13         {
14             int cur_left=0, cur_right=col;
15             for(int j=0; j<col; j++)
16             {
17                 if(matrix[i][j]=='1')
18                 {
19                     h[j] = h[j]+1;
20                 }
21                 else
22                     h[j] = 0;
23             }
24             for(int j=0; j<col; j++)
25             {
26                 if(matrix[i][j]=='1')
27                 {
28                     l[j] = max(l[j], cur_left);
29                 }
30                 else
31                 {
32                     cur_left = j+1;
33                     l[j]=0;
34                 }
35             }
36             for(int j=col-1; j>=0; j--)
37             {
38                 if(matrix[i][j]=='1')
39                 {
40                     r[j] = min(r[j], cur_right);
41                 }
42                 else
43                 {
44                     cur_right = j;
45                     r[j] = col;
46                 }
47             }
48             for(int j=0; j<col; j++)
49             {
50                 max_area = max(max_area, (r[j]-l[j])*h[j]);
51             }
52         }
53         return max_area;
54     }
55 };
原文地址:https://www.cnblogs.com/LJ-LJ/p/11323285.html