来源:链接:https://leetcode-cn.com/problems/maximal-square
声明:如果我侵犯了任何人的权利,请联系我,我会删除
欢迎高手来喷我
题目描述
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:4
输入:matrix = [[“0”,“1”],[“1”,“0”]]
输出:1
示例 3:
输入:matrix = [[“0”]]
输出:0
题解牛客上是二维数组,leetcode没有这个限制,所以在牛客上通过的代码在leetcode上不一定通过
牛客上通过的代码:
import java.util.*;
public class Solution {
/**
* 最大正方形
* @param matrix char字符型二维数组
* @return int整型
*/
public int solve (char[][] matrix) {
// write code here
if(matrix.length ==0 || matrix[0].length == 0) return 0;
int rows = matrix.length;
int cols = matrix[0].length;
int[][] dp = new int[rows][cols];
int maxSquareLength = 0;
for(int i = 0; i < rows; i++){
if(matrix[i][0] == '1') dp[i][0] = 1;
}
for(int i = 0; i < cols; i++){
if(matrix[0][i] == '1') dp[0][i] = 1;
}
for(int i =1; i < rows; i++){
for(int j = 1; j < cols; j++){
if(matrix[i][j] == '1'){
dp[i][j] = Math.min(Math.min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;
if(dp[i][j] > maxSquareLength) maxSquareLength = dp[i][j];
}
}
}
return maxSquareLength*maxSquareLength;
}
}
改造后在leetcode上能通过的代码:
不同点:对一维数组的考虑,
看一维数组上是否有1, 那么maxlen的初始值就是1,否则是0
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix == null || matrix.length == 0) return 0;
int row = matrix.length;
int col = matrix[0].length;
int[][] dp = new int[row][col];
int initlen = 0;
for(int i=0;i<row;++i){
if(matrix[i][0] == '1') {dp[i][0] = 1;initlen = 1;}
}
for(int i=0;i<col;++i){
if(matrix[0][i] == '1') {dp[0][i] = 1;initlen = 1;}
}
int maxlen = initlen;
for(int i=1;i<row;++i){
for(int j=1;j<col;++j){
if(matrix[i][j] == '1'){
dp[i][j] = Math.min(dp[i-1][j], Math.min(dp[i-1][j-1], dp[i][j-1])) + 1;
if(maxlen < dp[i][j]) maxlen = dp[i][j];
}
}
}
return maxlen * maxlen;
}
}