zoukankan      html  css  js  c++  java
  • 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.

    Analysis:

    For each position (i,j), we calculate how many accumlative 1s at the left direction of this position at this row. We record this number at d[i][j]. For example, for matrix:

    0 0 0 1 1 1

    0 1 1 1 1 1

    0 1 1 1 1 1

    1 0 1 1 1 1

    We have matrix d[i][j]

    0 0 0 1 2 3

    0 1 2 3 4 5

    0 1 2 3 4 5

    1 0 1 2 3 4

    Then, at each postion (i,j), we scan the matrix along the upper direction and calculate the area of the maximum 1 matrix with the right bottom corner at (i,j). For row k<i, the 1s matrix should be (k-i+1)*min(d[l][j], l=k...i);

    After caluclating the 1s matrix for each (i,j), we get the answer.

    Solution:

     1 public class Solution {
     2     public int maximalRectangle(char[][] matrix) {
     3         int rowNum = matrix.length;
     4         if (rowNum==0) return 0;
     5         int colNum = matrix[0].length;
     6         if (colNum==0) return 0;
     7 
     8         int[][] d = new int[rowNum][colNum];
     9         for (int i=0;i<rowNum;i++)
    10             for (int j=0;j<colNum;j++)
    11                 if (j==0)
    12                     if (matrix[i][j]=='1') d[i][j]=1;
    13                     else d[i][j]=0;
    14                 else
    15                     if (matrix[i][j]=='1') d[i][j]=d[i][j-1]+1;
    16                     else d[i][j]=0;
    17 
    18         int maxSoFar = -1;
    19         for (int i=0;i<rowNum;i++)
    20             for (int j=0;j<colNum;j++){
    21                 int curMax = d[i][j];
    22                 int minLen = d[i][j];
    23                 for (int k=(i-1);k>=0;k--){
    24                     if (d[k][j]==0) break;
    25                     if (d[k][j]<minLen) minLen = d[k][j];
    26                     int newMax = (i-k+1)*minLen;
    27                     if (curMax<newMax) curMax = newMax;
    28                 }
    29                 if (curMax>maxSoFar) maxSoFar = curMax;
    30 
    31             }
    32 
    33         return maxSoFar;
    34     }
    35 }
  • 相关阅读:
    大型项目使用Automake/Autoconf完成编译配置
    用C语言编写Windows服务程序的五个步骤
    RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)
    libuv和libev 异步I/O库的比较
    zlog 程序日志的库 交叉编译(Linux生成ARM库,观察执行步骤)
    应用服务
    EvnetBus
    this指向
    CPU使用率
    数据量小,创建索引有必要吗
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4117867.html
Copyright © 2011-2022 走看看