zoukankan      html  css  js  c++  java
  • leetcode 85. 最大矩形

    题目描述:

    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

    思路分析:

    这题是之前那道最大正方形的进阶,同样是利用dp来求解。通过逐行去计算最大矩形,即优化的子结构是当前行的最大矩形,从1行到2行,最后到n行。需要利用三个数组来求矩形面积,首先是h,表示当前位置矩形的最大高度,l和r分别表示了当前位置可向左右延伸到多远。其中l数组存左边界,r数组存右边界,是一个左闭右开区间。当遇到‘1’时,需要更新左右边界,左边界的更新是l[i] = max(l[i], cur_left),这里的l[i]即上一行时在当前位置的左边界,cur_left则表示在当前行的左边界,以此来保证其延伸的区域不会低于当前位置的高度。右边界的更新为r[i] = min(r[i], cur_right),右边界需要从右往左。

    代码:

     1 class Solution {
     2 public:
     3     int maximalRectangle(vector<vector<char>>& matrix) {
     4         int row = matrix.size();
     5         if(row == 0)
     6             return 0;
     7         int col = matrix[0].size();
     8         vector<int>l(col, 0);
     9         vector<int>r(col, col);
    10         vector<int>h(col, 0);
    11         int max_area = 0;
    12         for(int i=0; i<row; i++)
    13         {
    14             int cur_left=0, cur_right=col;
    15             for(int j=0; j<col; j++)
    16             {
    17                 if(matrix[i][j]=='1')
    18                 {
    19                     h[j] = h[j]+1;
    20                 }
    21                 else
    22                     h[j] = 0;
    23             }
    24             for(int j=0; j<col; j++)
    25             {
    26                 if(matrix[i][j]=='1')
    27                 {
    28                     l[j] = max(l[j], cur_left);
    29                 }
    30                 else
    31                 {
    32                     cur_left = j+1;
    33                     l[j]=0;
    34                 }
    35             }
    36             for(int j=col-1; j>=0; j--)
    37             {
    38                 if(matrix[i][j]=='1')
    39                 {
    40                     r[j] = min(r[j], cur_right);
    41                 }
    42                 else
    43                 {
    44                     cur_right = j;
    45                     r[j] = col;
    46                 }
    47             }
    48             for(int j=0; j<col; j++)
    49             {
    50                 max_area = max(max_area, (r[j]-l[j])*h[j]);
    51             }
    52         }
    53         return max_area;
    54     }
    55 };
  • 相关阅读:
    C#的几种下载文件方法
    分享下常用的网站
    C#操作XML文件
    MySQL截取字符串函数方法
    NLog使用方法
    弹出div提示框,背景变黑
    有关URL编码问题
    javascript 压缩工具
    [C#][Windows API] 常用Windows原生方法整理(Windows API) (不定期更新: 06/16)【转】
    An Introduction to IDS
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11323285.html
Copyright © 2011-2022 走看看