• [LeetCode] Maximal Rectangle


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

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

     1 class Solution {
     2 private:
     3     int f[1000][1000];
     4 public:
     5     int maximalRectangle(vector<vector<char> > &matrix) {
     6         // Start typing your C/C++ solution below
     7         // DO NOT write int main() function
     8         for(int i = 0; i < matrix.size(); i++)
     9             f[i][0] = matrix[i][0] == '1' ? 1 : 0;
    10             
    11         for(int i = 0; i < matrix.size(); i++)
    12             for(int j = 1; j < matrix[i].size(); j++)
    13                 f[i][j] = matrix[i][j] == '1' ? f[i][j-1] + 1 : 0;
    14                 
    15         int ret = 0;
    16         
    17         for(int i = 0; i < matrix.size(); i++)
    18             for(int j = 0; j < matrix[i].size(); j++)
    19             {
    20                 int k = i;
    21                 int width = INT_MAX;
    22                 
    23                 while(k >= 0)
    24                 {
    25                     if (f[k][j] == 0)
    26                         break;
    27                     
    28                     width = min(width, f[k][j]);
    29                 
    30                     ret = max(ret, width * (i - k + 1));   
    31                     
    32                     k--;                   
    33                 }
    34             }
    35             
    36         return ret;
    37     }
    38 };

     O(n^2)的算法,可以把问题看成求多个直方图的最大矩形面积,这样就可以从上往下来做例如第i层就是0~i的直方图,第i+1就是0~i+1的直方图,这样求直方图的复杂度O(n),于是就有O(n^2)

     1 class Solution {
     2 public:
     3     int calArea(vector<int> &a, vector<int> &width)
     4     {
     5         for(int i = 0; i < width.size(); i++)
     6             width[i] = 0;
     7             
     8         stack<int> s;
     9         for(int i = 0; i < a.size(); i++)
    10             if (s.empty())
    11             {
    12                 s.push(i);
    13                 width[i] = 0;
    14             }
    15             else
    16             {
    17                 while(!s.empty())
    18                 {
    19                     if (a[s.top()] < a[i])
    20                     {
    21                         width[i] = i - s.top() - 1;
    22                         s.push(i);
    23                         break;
    24                     }
    25                     else
    26                         s.pop();
    27                 }
    28                 
    29                 if (s.empty())
    30                 {
    31                     s.push(i);
    32                     width[i] = i;
    33                 }
    34             }
    35             
    36         while(!s.empty())
    37             s.pop();
    38             
    39         for(int i = a.size() - 1; i >= 0; i--)
    40             if (s.empty())
    41             {
    42                 s.push(i);
    43                 width[i] = 0;
    44             }
    45             else
    46             {
    47                 while(!s.empty())
    48                 {
    49                     if (a[i] > a[s.top()])
    50                     {
    51                         width[i] += s.top() - i - 1;
    52                         s.push(i);
    53                         break;
    54                     }
    55                     else
    56                         s.pop();
    57                 }
    58                 
    59                 if (s.empty())
    60                 {
    61                     width[i] += a.size() - i - 1;
    62                     s.push(i);
    63                 }
    64             }
    65         
    66         int maxArea = 0;    
    67         for(int i = 0; i < width.size(); i++)
    68             maxArea = max(maxArea, (width[i] + 1) * a[i]);
    69             
    70         return maxArea;
    71     }
    72     
    73     int maximalRectangle(vector<vector<char> > &matrix) {
    74         // Start typing your C/C++ solution below
    75         // DO NOT write int main() function
    76         if (matrix.size() == 0)
    77             return 0;
    78             
    79         vector<int> a(matrix[0].size(), 0);
    80         vector<int> width(matrix[0].size());
    81         
    82         int maxArea = 0;
    83         for(int i = 0; i < matrix.size(); i++)
    84         {
    85             for(int j = 0; j < matrix[i].size(); j++)
    86                 a[j] = matrix[i][j] == '1' ? a[j] + 1 : 0;
    87                 
    88             maxArea = max(maxArea, calArea(a, width));
    89         }
    90         
    91         return maxArea;
    92     }
    93 };

     

  • 相关阅读:
    微信小程序之文件(图片)使用MD5加密(二)
    微信小程序之文件(图片)使用MD5加密(一)
    02-Django简介
    01-Web框架的原理
    15-pymysql模块的使用
    06-数据类型
    05-表的操作
    04-库的操作
    03-初始mysql语句
    02-MySql安装和基本管理
  • 原文地址:https://www.cnblogs.com/chkkch/p/2766566.html
Copyright © 2020-2023  润新知