leetcode221—最大正方形原题链接
题意简述
输入: matrix [][]char,只包含’0’和’1’的矩阵;
操作: 找出只包含’1’的最大正方形,计算其面积
输出: max int,该面积
解法分析
动态规划
dp[i][j]: 以matrix[i][j]为正方形右下角且只包含'1'的最大正方形边长;
状态转移方程:
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1;
初始条件:
dp[i][0]=matrix[i][0]-'0';
dp[0][i]=matrix[0][i]-'0';
复杂度分析
时间复杂度: O(n2);
空间复杂度: O(n2);
优化分析
空间复杂度可以优化到O(n),与leetcode72—编辑距离思路一样,下面给出的代码未进行此优化-_-!(懒就一个字,不解释
代码
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix.length == 0) return 0;
int[][] dp = new int[matrix.length][matrix[0].length];
int max = 0;
dp[0][0] = matrix[0][0] == '1' ? 1 : 0;
max = Math.max(max,dp[0][0]);
for(int i = 1; i < matrix.length; i++) {
dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
max = Math.max(max,dp[i][0]);
}
for(int i = 1; i < matrix[0].length; i++) {
dp[0][i] = matrix[0][i] == '1' ? 1 : 0;
max = Math.max(max,dp[0][i]);
}
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[i].length; j++) {
if(matrix[i][j] == '0') {
dp[i][j] = 0;
continue;
}
dp[i][j] = Math.min(dp[i - 1][j - 1],Math.min(dp[i][j - 1],dp[i - 1][j])) + 1;
max = Math.max(max,dp[i][j]);
}
}
return max * max;
}
}
func maximalSquare(matrix [][]byte) int {
row := len(matrix)
if row == 0 {
return 0
}
col := len(matrix[0])
var dp [1000][1000]int
if matrix[0][0] == '1' {
dp[0][0] = 1
} else {
dp[0][0] = 0
}
maxx := dp[0][0];
for i := 1; i < row; i++ {
if matrix[i][0] == '1' {
dp[i][0] = 1
maxx = max(maxx,dp[i][0])
} else {
dp[i][0] = 0
}
}
for i := 1; i < col; i++ {
if matrix[0][i] == '1' {
dp[0][i] = 1
maxx = max(maxx,dp[0][i])
} else {
dp[0][i] = 0
}
}
for i := 1; i < row; i++ {
for j := 1; j < col; j++ {
if matrix[i][j] == '0' {
dp[i][j] = 0
continue
}
dp[i][j] = min(dp[i - 1][j - 1],min(dp[i - 1][j],dp[i][j - 1])) + 1
maxx = max(maxx,dp[i][j])
}
}
return maxx * maxx
}
func max(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
func min(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
(为嘛老觉得Go写起来很繁琐呢…欢迎指教)