zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Maximal Square

    Maximal Square

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

    For example, given the following matrix:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    
    Return 4.
     
     
     

     
     
     
    找出地图中最大的一个由1组成的正方形。
     
    动态规划,大的正方型是由小的正方形加上两条边组成的。
    遍历二维数组,第一次遇到1的时候,dp数组的对应位置也记做1.
    再遇到1的时候,查看这个点的左上角(dp[i - 1][j - 1])是不是存在,以及检查上边和左边是否全部是1。
     
    举例来说:
    1 1
    1 1
    遍历到右下的点(坐标[1][1])。
    发现左上角是1,又知道当前点的左边和上面也是1,说明构成了2X2的正方形,把当前点在dp数组中记做2。
     
    复杂点的情况比如:
    1 1 0
    1 1 1
    1 1 1
    坐标为[0][0]的点在dp中记做1,坐标为[1][1]的点记做2,没有问题。
    当遍历到[3][3]时,因为[0][2]是0,所以[3][3]在dp中只能记做2。
     
    最后,因为dp中记录的是矩形的宽度,return的时候返回平方数。
     
     1 /**
     2  * @param {character[][]} matrix
     3  * @return {number}
     4  */
     5 var maximalSquare = function(matrix) {
     6     if(matrix.length === 0) return 0;
     7     var max = 0, i, j, dp = [],
     8         height = matrix.length, width = matrix[0].length;
     9     for(i = 0; i < height; i++)
    10         dp[i] = [];
    11     for(i = 0; i < height; i++){
    12         for(j = 0; j < width; j++){
    13             if(matrix[i][j] === '1'){
    14                 dp[i][j] = getSquare(i, j);
    15                 max = Math.max(max, dp[i][j]);
    16             }
    17         }
    18     }
    19     return max * max;
    20 
    21     function getSquare(i, j){
    22         if(!matrix[i - 1] || !matrix[i - 1][j - 1])
    23             return 1;
    24         var index, width = dp[i - 1][j - 1];
    25         if(!width) return 1;
    26         for(index = 1; index <= width; index++)
    27             if(!matrix[i - index] || matrix[i - index][j] !== '1'
    28                 || matrix[i][j - index] !== '1')
    29                 return index;
    30         return width + 1;
    31     }
    32 };
  • 相关阅读:
    qsort()的使用
    c语言不寻常的类型转换(类型提升)
    堆栈段的三个主要用途
    区分 声明与定义
    宏定义陷阱与typedef
    约瑟夫环解决方案
    线程中断测试
    Redis
    本地缓存
    tomcat优化
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5225665.html
Copyright © 2011-2022 走看看