[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‘

时间: 2024-10-29 19:11:36

[LintCode] Maximal Square II的相关文章

[LintCode] 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. Related Problems Maximal Square II Maximum Su

[LintCode] 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. Have you met this question in a real interview? Example 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

Maximal Square II

Description 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 Example 1: Input: [[1,0,1,0,0],[1,0,0,1,0],[1,1,0,0,1],[1,0,0,1,0]] Outp

lintcode 中等题: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. 解题: 给定一个二维01矩阵,从中找出最大的全

leetcode每日解题思路 221 Maximal Square

问题描述: 题目链接:221 Maximal Square 问题找解决的是给出一个M*N的矩阵, 只有'1', '0',两种元素: 需要你从中找出 由'1'组成的最大正方形.恩, 就是这样. 我们看到, 这道题目的标签还是DP, 那么问题的关键就是要找到一个符合判断是否为正方形的递推式. 老套路, 先看基本型, 对于一个2*2的正方形,对于右下角的元素(1,1)而言, 他的上(0,1), 左(1,0), 左上(0,0)三个元素应该都是'1', 如此才能够组成一个合规的正方形: 那么如果是一个3*

leetcode_221题——Maximal Square (动态规划)

Maximal Square Total Accepted: 6373 Total Submissions: 31927My Submissions Question Solution 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

【动态规划】leetcode - 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. 分析: 利用动态规划求解.建立一个类node.nod

【LeetCode】221. 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. Credits:Special thanks to @Fre

[虚拟机OA]Maximal Square 最大正方形

Given a 2D binary matrix filled with 0's and 1's,find the largest square containing only 1's and return its area. Input: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0 Output: 4 (参考LeetCode 221 Maximal Square) 思路: dp[i][j] 代表在以i, j 这个点为右下角的正方形变成若这一格的值是1, 则这个正方