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