#LeetCode:1277. Count Square Submatrices with All Ones

灆洢 2020-05-21 20:24:52

此題要找出給予的陣列中,能全是 1 的正方形有幾個。

建立一個二維陣列,每一個位置代表的是以此為右下角的矩形有幾個能都是 1。首先第一排和第一列基本上只能有長度為 1 的正方形,所以會與原資料相同。接下來的每一個位置,就去判斷往上、往左上和往左能全是 1 的範圍能多大,取三者之最小值表示能往三個方向都是 1 的最遠範圍(如下圖所示),此最遠範圍再加上自己也有 1 個長度則為能出現全是 1 的正方形的最大長度,也即為以此點為右下角的正方形的個數。將所有點都做完此計算加總即是答案。

LeetCode 1277

Kotlin(360ms)

/*******************************************************
 * LeetCode 1277. Count Square Submatrices with All    *
 *                Ones                                 *
 * Author: Maplewing [at] knightzone.studio            *
 * Version: 2020/05/21                                 *
 *******************************************************/
class Solution {
    fun countSquares(matrix: Array<IntArray>): Int {
        var count = 0
        val rightBottomSquareSums = Array<IntArray>(matrix.size, { i -> 
            IntArray(matrix[0].size, { j -> matrix[i][j] }) })
        for (i in 0..matrix.lastIndex) {
            for (j in 0..matrix[i].lastIndex) {
                if (matrix[i][j] != 1) continue

                if (i == 0 || j == 0) {
                    count += rightBottomSquareSums[i][j]
                    continue
                }

                rightBottomSquareSums[i][j] = Math.min(rightBottomSquareSums[i - 1][j - 1],
                    Math.min(rightBottomSquareSums[i - 1][j], rightBottomSquareSums[i][j - 1])) + 1
                count += rightBottomSquareSums[i][j]
            }
        }

        return count
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料