leetcode Maximal Rectangle

来源:互联网 发布:淘宝网店装修模板代码 编辑:程序博客网 时间:2024/06/08 19:54

Description:

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


Solution:


递推公式如下:

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'.

DP


class Solution {    public:        int maximalRectangle(vector<vector<char> > &matrix) {            if(matrix.empty()) return 0;            const int m = matrix.size();            const int n = matrix[0].size();            int left[n], right[n], height[n];            fill_n(left,n,0); fill_n(right,n,n); fill_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;        }};    


原创粉丝点击