221. 最大正方形

目录

221. 最大正方形

mid

在一个由 '0''1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。

image-20220808110731358

DP

若某格子值为 1,则以此为右下角的正方形的、最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格。 $$ dp(i, j) = min(dp(i - 1, j), dp(i, j - 1), dp(i - 1, j - 1)) + 1; $$ 这个转移方程比较神奇,感受一下就好

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/8c4bf78cf6396c40291e40c25d34ef56bd524313c2aa863f3a20c1f004f32ab0-image.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
func maximalSquare(matrix [][]byte) int {
	rows, cols := len(matrix), len(matrix[0])
	dp := make([][]int, rows)
	for i := 0; i < rows; i++ {
		dp[i] = make([]int, cols)
	}
	maxSideLen := 0
	// 先给第0行和第0列赋值
	for y := 0; y < cols; y++ {
		if matrix[0][y] == '1' {
			dp[0][y] = 1
			maxSideLen = 1
		} else {
			dp[0][y] = 0
		}
	}
	for x := 0; x < rows; x++ {
		if matrix[x][0] == '1' {
			dp[x][0] = 1
			maxSideLen = 1
		} else {
			dp[x][0] = 0
		}
	}
	for x := 1; x < rows; x++ {
		for y := 1; y < cols; y++ {
			if matrix[x][y] == '1' {
				dp[x][y] = min(dp[x-1][y-1], min(dp[x-1][y], dp[x][y-1])) + 1
				if dp[x][y] > maxSideLen {
					maxSideLen = dp[x][y]
				}
			}
		}
	}
	return maxSideLen * maxSideLen
}

func min(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}