Maximal Rectangle

来源:互联网 发布:乐视网络大电影合作 编辑:程序博客网 时间:2024/05/29 08:02

题目

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

思路一:O(N4)

遍历,不断更新最大值。

class Solution {public:    int maximalRectangle(vector<vector<char> > &matrix) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if (matrix.empty() || matrix[0].empty())             return 0;        int max = 0;        for(int row = 0; row < matrix.size(); row++)            for(int col = 0; col < matrix[0].size(); col++){                int area = getArea(matrix, row, col);                if (max < area) max = area;            }        return max;    }    int getArea(vector<vector<char> > &matrix, int const cornerRow, int const cornerCol){        int maxArea = 0;        int maxX = matrix[0].size();        for(int row = cornerRow; row < matrix.size(); ++row){            if (matrix[row][cornerCol] == '0') break;            for(int x = cornerCol; x < maxX; ++x){                if (matrix[row][x] == '0'){                    maxX = x;                    break;                }            }            int area = (maxX-cornerCol) * (row-cornerRow+1);            if (maxArea <area) maxArea = area;        }        return maxArea;            }};

思路二:O(N3)

用f[i][j]来记录i行以j列为结尾,往前连续的1的个数。然后再一个O(n^3)的循环来找以(i, j)为右下角的矩形最大的1的面积。

上述矩阵将产生:

0 1 2 3 0

0 1 2 3 4

0 0 1 0 1

 

class Solution { public:     int maximalRectangle(vector<vector<char> > &matrix) {         // Start typing your C/C++ solution below         // DO NOT write int main() function         if(matrix.size()==0 || matrix[0].size()==0)             return 0;         vector<vector<int> > f(matrix.size()+1, vector<int>(matrix[0].size()+1,0));         for(int i=0; i<matrix.size(); i++)             f[i][0] = matrix[i][0]=='1'?1:0;         // Create the row-lines with number of 1s          for(int i=0; i<matrix.size(); i++)             for(int j=1; j<matrix[i].size(); j++)                 f[i][j] = matrix[i][j]=='1'?f[i][j-1]+1:0;         // Make (i,j) as the right-bottom corner, and find the max-rows-cols                 int result = 0;                  for(int i=0; i<matrix.size(); i++)             for(int j=0; j<matrix[i].size(); j++)             {                 int k = i;                 int width = INT_MAX;                              while(k >= 0)                 {                     if(f[k][j] == 0)  break;                                      width = min(width,f[k][j]);                     result = max(result, width*(i-k+1));                        k--;                                    }             }                      return result;     } };

 

原创粉丝点击