1504. Count Submatrices With All Ones

DP

O(m*n*worst(m)) = O(m^2n)

ๅฆ‚ๆžœไปŠๅคฉๅชๆ˜ฏ1d array...

[1,1,1,1]

้‚ฃๆ˜ฏไธๆ˜ฏๅฐฑๆ˜ฏ 1 + 2 + 3 +4 = 10, 10 ็จฎ matrices

ๆ‰€ไปฅๅœจๆŸ row ไธŠ, ๆŒ็บŒ็œ‹ๅทฆ้‚ŠๅŽปๅขž้•ท, ๅฆ‚ๆžœไธญ้–“ๆœ‰ 0 ็š„, ้‚ฃๅฐฑๆ˜ฏ 0 ๏ผˆๆ–ทๆŽ‰ไบ†

row ็œ‹ๅทฆ้‚ŠๅฎŒไบ†

้‚ฃๅœจ็œ‹ไธŠ้ข...ๆ‰€ไปฅๅ†่ท‘ไธ€ๅ€‹ for ็œ‹ไธŠ้ข , ็œ‹ๆฏๅ€‹ๅ…ƒ็ด ๅ€ผๆœ€ๅฐๅคšๅฐ‘, ไปฃ่กจๅฏไปฅๆนŠๆˆๆ›ดๅคš็š„ matrices, ไธ€ๆจฃ, ๅฆ‚ๆžœไธญ้–“ๆœ‰ 0 ๅฐฑๆ–ทๆŽ‰ไบ†

ex:

1 โ†’ 0

0 โ†’ 0

1 โ†’ 1. ไธญ้–“ๆ–ทๆŽ‰ไบ† ๆ‰€ไปฅๅช่ƒฝ็ฎ—ไธ€ๅ€‹

ๅ…ถไป–ๅ‘ไธŠ็œ‹็š„ case

1

1

1 โ†’ ไปฃ่กจๆœ‰ไธ‰ๅ€‹๏ผ1+1+1

2

1

1 โ†’ ้‚„ๆ˜ฏ 3 ๅ€‹

class Solution {
   public int numSubmat(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        
        int count = 0;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (mat[i][j] == 0) {
                    continue;
                }
                // cal left
                mat[i][j] = (j == 0 ? 0 : mat[i][j-1]) + 1;
                count += mat[i][j];
                
                // cal up
                int min = mat[i][j];
                for (int k = i-1; k >= 0; k--) {
                    min = Math.min(min, mat[k][j]);
                    count += min;
                }
            }
        }
        return count;
    }
}

/*
O(m*n*worst(m))
*/

python

class Solution:
    def numSubmat(self, mat: List[List[int]]) -> int:

        count = 0
        for i in range(len(mat)):
            for j in range(len(mat[0])):
                if mat[i][j] == 0:
                    continue
                    
                mat[i][j] = (0 if (j == 0) else mat[i][j-1]) + 1
                count += mat[i][j]
                
                min_val = mat[i][j]
                for k in range(i-1, -1, -1):
                    
                    min_val = min(min_val, mat[k][j])
                    count += min_val
        return count

Last updated