问题描述
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
题目大意说的是给定一个矩阵,判断最大的全是“1”的矩形面积。
思路分析
这题第一眼给人感觉要用动态规划,我最初的想法就是用一个二维数组。那样确实可以做,但是最后想到了用三个一维数组的动态规划来解决问题。
首先定义三个一维数组,height[j],left[j],right[j]。他们的含义如下:(针对第i行的数据)
height[j]:表示包含 j 在内的矩阵的高度
left[j]:表示包含 j 在内的矩阵的左边界(包括在内)
right[j]:表示包含 j 在内的矩阵的右边界(不包括在内)
对于三类数组的动态规划如下(其中height和left都是从0到n,所以放在一个循环中):
for(int j=0; j<n; j++){
if(matrix[i][j]=='1'){
height[j]++;
left[j] = max(left[j], cur_left);
}
else{
height[j] = 0;
left[j] = 0;
cur_left = j+1;
}
}
for(int j=n-1; j>=0; j--){
if(matrix[i][j]=='1')
right[j] = min(right[j], cur_right);
else{
right[j] = n;
cur_right = j;
}
}
C++代码如下:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
const int m = matrix.size(), n = matrix[0].size();
vector<int> left(n, 0), right(n, n), height(n, 0);
int maxArea = 0;
for(int i=0; i<m; i++){
int cur_left = 0, cur_right = n;
for(int j=0; j<n; j++){
if(matrix[i][j]=='1'){
height[j]++;
left[j] = max(left[j], cur_left);
}
else{
height[j] = 0;
left[j] = 0;
cur_left = j+1;
}
}
for(int j=n-1; j>=0; j--){
if(matrix[i][j]=='1')
right[j] = min(right[j], cur_right);
else{
right[j] = n;
cur_right = j;
}
}
for (int j = 0; j < n; j++)
maxArea = max(maxArea, (right[j] - left[j])*height[j]);
}
return maxArea;
}
};