1. 程式人生 > 實用技巧 >leetcode刷題筆記 221題 最大正方形

leetcode刷題筆記 221題 最大正方形

leetcode刷題筆記 221題 最大正方形

源地址:221. 最大正方形

問題描述:

在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

示例:

輸入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

輸出: 4

//基於動態規劃思想處理, dp(i)(j)表示以i、j為右下節點的正方形的最大邊長
//初始狀態 
//if (i == 0 || j ==0)情況下
//if (matrix(i)(j) == 1) dp(i)(j) = 1
//else dp(i)(j) = 0
//狀態轉移方程
//if (matrix(i)(j) == 1) dp(i)(j) = math.min(math.min(dp(i-1)(j), dp(i)(j-1)), dp(i-1)(j-1))+1
//else dp(i)(j) = 0
object Solution {
    def maximalSquare(matrix: Array[Array[Char]]): Int = {
        if (matrix.length == 0 || matrix(0).length == 0) return 0
        
        var maxSide = 0
        val rowLength = matrix.length
        val colLength = matrix(0).length
        val dp = Array.ofDim[Int](rowLength,colLength)
        
        for (i <- 0 to rowLength - 1) {
            for (j <- 0 to colLength - 1){
                if (matrix(i)(j) == '1') {
                    if (i == 0 || j == 0) dp(i)(j) = 1
                    else dp(i)(j) = Math.min(Math.min(dp(i-1)(j-1), dp(i)(j-1)), dp(i-1)(j)) + 1
                }
                maxSide = Math.max(maxSide, dp(i)(j))
            }
        }
        
        return maxSide * maxSide
    }
}