85. Maximal Rectangle 一行一行遍历方形

来源:互联网 发布:淘宝皮草款式 编辑:程序博客网 时间:2024/06/08 08:02

题目:

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

For example, given the following matrix:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 6.

分析:

思路同样是从第一行开始一行一行地处理,使[i, j]处最大子矩阵的面积是(right(i, j)-left(i, j))*height(i, j)。其中height统计当前位置及往上'1'的数量;left和right是高度是当前点的height值得左右边界,即是以当前点为中心,以height为高度向两边扩散的左右边界。

递推公式如下:

left(i, j) = max(left(i-1, j), cur_left);right(i, j) = min(right(i-1, j), cur_right);height(i, j) = height(i-1, j) + 1, if matrix[i][j]=='1';height(i, j) = 0, if matrix[i][j]=='0'.

其中cur_left和cur_right的值由当前行决定,如果当前位置是'1',则cur_left和cur_right都不变;如果当前位置是'0',则cur_left就为当前位置的右侧,cur_right就为当前位置(因为左闭右开)。

时间复杂度:O(mn)

空间复杂度:O(n)


代码:

class Solution {public:    int maximalRectangle(vector<vector<char>>& matrix) {        if(matrix.empty()) return 0;     int m = matrix.size();     int n = matrix[0].size();     vector<int> left(n, 0), right(n, n), height(n, 0);    int maxA = 0;    for(int i=0; i<m; i++) {        int cur_left=0, cur_right=n;         for(int j=0; j<n; j++) { // compute height (can do this from either side)            if(matrix[i][j]=='1') height[j]++;             else height[j]=0;        }        for(int j=0; j<n; j++) { // compute left (from left to right)            if(matrix[i][j]=='1') left[j]=max(left[j],cur_left);            else {left[j]=0; cur_left=j+1;}        }        // compute right (from right to left)        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;}            }        // compute the area of rectangle (can do this from either side)        for(int j=0; j<n; j++)            maxA = max(maxA,(right[j]-left[j])*height[j]);    }    return maxA;    }};

原创粉丝点击