未分類

Maximal Square

Maximal Square

Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.

For example:

Given the following matrix:

1
2
3
4
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 4.

Default:

1
2
3
func maximalSquare(matrix [][]byte) int {
}

解答思路:

要從一平面中找可圍出的最大正方形面積,只要從邊長為1開始找起,每當遍歷一個新的值時,就將該位置當作正方形最左上角的位置,檢查該正方形是否符合條件,如果是就記錄當下邊長所圍出的面積,再從頭遍歷整個二元陣列以找更長一點的邊長,而如果不符合條件則繼續往下遍歷,以下一個值來做為新正方形最左上角的位置,直到全數遍歷結束如果還是沒有找到該邊長符合條件的正方形,此時便直接回傳目前所找到的最大面積,因為如果面積較小的正方形不存在,鐵定不會有更大面積的正方形。

程式碼解說:

一開始就從邊長為1開始,最多只能找到邊長跟整個平面的邊一樣大為止,之後以巢狀迴圈遍歷整個平面的值,每當遍歷一個新的值時,就將該位置當作正方形最左上角的位置,檢查該正方形是否符合條件,先判斷該正方形是否位於平面之中,再檢查正方形範圍內的值是否皆為1(這邊是帶入其它的函數來檢查),如果都符合條件就記錄當下邊長所圍出的面積,再跳開巢狀迴圈從頭遍歷整個二元陣列以找更長一點的邊長,而如果直到全數遍歷結束還是沒有找到該邊長符合條件的正方形,此時便直接回傳目前所找到的最大面積

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
func maximalSquare(matrix [][]byte) int {
var exist bool
var maxArea int
for side := 1; side <= len(matrix); side++ {
exist = false
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
if i+side <= len(matrix) && j+side <= len(matrix[0]) {
if checkSquare(matrix, i, j, side) {
exist = true
maxArea = side * side
break
}
} else {
break
}
}
if exist {
break
}
}
if !exist {
break
}
}
return maxArea
}

這部分則是用來檢查正方形範圍內的值是否皆為1,如果出現值不等於1時便直接回傳false,否則直到全數範圍檢查完畢才回傳true

1
2
3
4
5
6
7
8
9
10
func checkSquare(matrix [][]byte, y int, x int, side int) bool {
for i := y; i < y+side; i++ {
for j := x; j < x+side; j++ {
if matrix[i][j] != '1' {
return false
}
}
}
return true
}

完整程式碼:

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
func maximalSquare(matrix [][]byte) int {
var exist bool
var maxArea int
for side := 1; side <= len(matrix); side++ {
exist = false
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
if i+side <= len(matrix) && j+side <= len(matrix[0]) {
if checkSquare(matrix, i, j, side) {
exist = true
maxArea = side * side
break
}
} else {
break
}
}
if exist {
break
}
}
if !exist {
break
}
}
return maxArea
}
func checkSquare(matrix [][]byte, y int, x int, side int) bool {
for i := y; i < y+side; i++ {
for j := x; j < x+side; j++ {
if matrix[i][j] != '1' {
return false
}
}
}
return true
}

總結:

要從一平面中找可圍出的最大正方形面積,只要從邊長為1開始找起,每遍歷一個新的值就將該位置當作正方形最左上角的位置,檢查該正方形是否符合條件,如果是就記錄當下邊長所圍出的面積,再從頭遍歷整個二元陣列以找更長一點的邊長,而如果不符合條件則繼續往下遍歷,以下一個值來做為新正方形最左上角的位置,直到全數遍歷結束如果還是沒有找到該邊長符合條件的正方形,此時便直接回傳目前所找到的最大面積。

分享到