题目描述:
给定一个仅包含 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 };