LeetCode.221 最大正方形
2019-07-03 本文已影响0人
风卷晨沙
1、题目
最大正方形 - 力扣(LeetCode) https://leetcode-cn.com/problems/maximal-square/
2、题解
这道题目可以使用动态规划的思想,也就是将原问题拆解成子问题,再分治的想法。
在此题中,其实就是把计算在整个数组中最大的正方形的这个问题,拆解成两个小的问题,一是储存以该点为右下角的正方形的边长大小,二是比较这个数组中储存的值的大小。这样就可以得到最终的结果。
解释一下,为什么是以该点为右下角的正方形的边长大小
当我们判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。那具体的最大正方形边长呢?我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,此时有两种情况,一是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点(即上三点某一个正方形的边长加1)就可以构成一个更大的正方形。二它的上方,左方和左上方为右下角的正方形的大小不一样,合起来就会缺了某个角落,这时候只能取那三个正方形中最小的正方形的边长加1了。
最后,分享一下了解动态规划的文章?
动态规划算法入门,这就够了 https://baijiahao.baidu.com/s?id=1631319141857419948&wfr=spider&for=pc
3、代码
//1、动态规划
class Solution {
public int maximalSquare(char[][] matrix) {
//排除异常情况
if(matrix.length==0||matrix[0].length==0){
return 0;
}
int result=0;
int rows = matrix.length;
int columns = matrix[0].length;
int[][] dp = new int[rows][columns];//用dp来保存结果
for (int i = 0; i < rows; i++) {
if(matrix[i][0]=='1'){
dp[i][0]=1;
result=1;
}
}
for (int j = 0; j < columns; j++) {
if (matrix[0][j]=='1'){
dp[0][j]=1;
result=1;
}
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < columns; j++) {
if(matrix[i][j]=='1'){
dp[i][j] = getMin(dp[i][j - 1], dp[i - 1][j - 1], dp[i - 1][j])+1;
result=getMax(result,dp[i][j]);
}
}
}
return result*result;
}
//得到最小整数值
private int getMin(int... values){
int minValue = Integer.MAX_VALUE;
for (int value:values){
if(value<minValue){
minValue=value;
}
}
return minValue;
};
//得到最大整数值
private int getMax(int... values){
int maxValue = Integer.MIN_VALUE;
for (int value:values){
if(value>maxValue){
maxValue=value;
}
}
return maxValue;
}
}