LintCode刷题——最大正方形
Posted Revenent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode刷题——最大正方形相关的知识,希望对你有一定的参考价值。
题目描述:
在一个二维01矩阵中找到全为1的最大正方形;
样例:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4;
算法分析:
对于给定矩阵matrix[][],可以建立对应的矩阵DP[][],用DP[i][j]来记录以点i,j为右下角的全1矩阵的最大边长。同时经过分析可以得出,DP[i][j]的值与DP[i-1][j],DP[i][j-1],DP[i-1][j-1]这三者的值有关:
①若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]三者中存在0值,则DP[i][j]一定为0;
②若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]均不为0,则DP[i][j]为三者中的最小值+1,因为三者中的最小值一定为三者所共有的不含0的部分,否则会造成缺角;
因此对于某一点(i,j), 若matrix[i][j]=1,则动态规划表达式为DP[i][j] = min{DP[i-1][j],DP[i][j-1],DP[i-1][j-1]} + 1;
代码:
public class Solution { /* * @param matrix: a matrix of 0 and 1 * @return: an integer */ public int maxSquare(int[][] matrix) { // write your code here if(matrix==null){ return 0; } int m = matrix.length; int n = matrix[0].length; int res = 0; int[][] result = new int[m][n]; //矩阵初始化 for(int i=0;i<m;i++){ result[i][0] = matrix[i][0]; res = Math.max(matrix[i][0],res); } for(int j=0;j<n;j++){ result[0][j] = matrix[0][j]; res = Math.max(matrix[0][j],res); } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ if(matrix[i][j]==1){ result[i][j] = Math.min(result[i-1][j],Math.min(result[i][j-1],result[i-1][j-1]))+1; } res = Math.max(res,result[i][j]); } } return res*res; } }
以上是关于LintCode刷题——最大正方形的主要内容,如果未能解决你的问题,请参考以下文章