zoukankan      html  css  js  c++  java
  • [LintCode] Maximal Square II

    Given a 2D binary matrix filled with 0's and 1's, find the largest square which diagonal is all 1 and others is 0.

    Only consider the main diagonal situation.
    Example

    For example, given the following matrix:

    1 0 1 0 0
    1 0 0 1 0
    1 1 0 0 1
    1 0 0 1 0
    

    Return 9

    Similiarly with Maximal Square, we can check each entry of 1 from scratch and get the max length of a square whose diagonal is all 1 and others are 0.

    Again, this straightforward solution suffers the same NOT using previous check results to expediate our algorithm's runtime.

    So we jump directly into the dynamic programming solution. 

    State: dp[i][j]: the max length of a square with only diagonal 1s whose bottom right corner is matrix[i][j]. 

    Function: dp[i][j] = 0, if matrix[i][j] == 0;

         dp[i][j] = 1 + min {leftZeros[i][j], upZeros[i][j], dp[i - 1][j - 1]}, if matrix[i][j] == 1;

    Similarly with Maxmial Square, when matrix[i][j] is 1, we also need to check its left, top, top left side.

    leftZeros[i][j] is the max number of consecutive 0s to the left of matrix[i][j];

    upZeros[i][j] is the max number of consecutive 0s to the top of matrix[i][j];

    These two along with dp[i - 1][j - 1] decides the max length of a sqaure with only diagonal 1s whose bottom right corner is matrix[i][j]. 

     1 public class Solution {
     2     public int maxSquare2(int[][] matrix) {
     3         if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
     4             return 0;
     5         }
     6         int n = matrix.length; int m = matrix[0].length;
     7         int[][] leftZeros = new int[n][m];
     8         int[][] upZeros = new int[n][m];
     9         for(int i = 0; i < n; i++){
    10             leftZeros[i][0] = 0;
    11         }
    12         for(int j = 0; j < m; j++){
    13             upZeros[0][j] = 0;
    14         }
    15         for(int i = 0; i < n; i++){
    16             for(int j = 1; j < m; j++){
    17                 if(matrix[i][j - 1] == 0){
    18                     leftZeros[i][j] = leftZeros[i][j - 1] + 1;
    19                 }    
    20                 else{
    21                     leftZeros[i][j] = 0;
    22                 }
    23             }
    24         }
    25         for(int i = 1; i < n; i ++){
    26             for(int j = 0; j < m; j++){
    27                 if(matrix[i - 1][j] == 0){
    28                     upZeros[i][j] = upZeros[i - 1][j] + 1;
    29                 }
    30                 else{
    31                     upZeros[i][j] = 0;
    32                 }                
    33             }
    34         }
    35         int[][] dp = new int[n][m];
    36         for(int i = 0; i < n; i++){
    37             dp[i][0] = matrix[i][0];    
    38         }
    39         for(int j = 0; j < m; j++){
    40             dp[0][j] = matrix[0][j];
    41         }
    42         for(int i = 1; i < n; i++){
    43             for(int j = 1; j < m; j++){
    44                 if(matrix[i][j] == 0){
    45                     dp[i][j] = 0;
    46                 }
    47                 else{
    48                     dp[i][j] = Math.min(Math.min(leftZeros[i][j], upZeros[i][j]), dp[i - 1][j - 1]) + 1;
    49                 }
    50             }
    51         }
    52         int max = 0;
    53         for(int i = 0; i < n; i++){
    54             for(int j = 0; j < m; j++){
    55                 max = Math.max(max, dp[i][j]);    
    56             }
    57         }
    58         return max * max;
    59     }
    60 }

    Related Problems

    Maximal Square

    Maximum Subsquare surrounded by 'X'

  • 相关阅读:
    索尼MT27i Android2.3.7 线刷Android4.04
    如何在三分钟内要到陌生女孩的电话
    闲情逸致小说嫉妒
    LINQ查询返回DataTable类型
    30个Oracle语句优化规则详解(1)
    .net session超时设置 sessionState的相关属性
    Socket请求和Http请求的各自特点、区别及适用场景
    在Oracle触发器中调用webService 或者java程序
    vs2010中使用log4net的方法
    Oracle 记录操作时长
  • 原文地址:https://www.cnblogs.com/lz87/p/7393780.html
Copyright © 2011-2022 走看看