Given an m x n binary matrix mat, return the number of submatrices that have all ones.
Example 1:
Input: mat = [[1,0,1],[1,1,0],[1,1,0]]
Output: 13
Explanation:
There are 6 rectangles of side 1x1.
There are 2 rectangles of side 1x2.
There are 3 rectangles of side 2x1.
There is 1 rectangle of side 2x2.
There is 1 rectangle of side 3x1.
Total number of rectangles = 6 + 2 + 3 + 1 + 1 = 13.
Example 2:
Input: mat = [[0,1,1,0],[0,1,1,1],[1,1,1,0]]
Output: 24
Explanation:
There are 8 rectangles of side 1x1.
There are 5 rectangles of side 1x2.
There are 2 rectangles of side 1x3.
There are 4 rectangles of side 2x1.
There are 2 rectangles of side 2x2.
There are 2 rectangles of side 3x1.
There is 1 rectangle of side 3x2.
Total number of rectangles = 8 + 5 + 2 + 4 + 2 + 2 + 1 = 24.
Constraints:
1 <= m, n <= 150
mat[i][j] is either 0 or 1.
Solutions
Solution 1: Enumeration + Prefix Sum
We can enumerate the bottom-right corner \((i, j)\) of the matrix, and then enumerate the first row \(k\) upwards. The width of the matrix with \((i, j)\) as the bottom-right corner in each row is \(\min_{k \leq i} \textit{g}[k][j]\), where \(\textit{g}[k][j]\) represents the width of the matrix with \((k, j)\) as the bottom-right corner in the \(k\)-th row.
Therefore, we can preprocess a 2D array \(g[i][j]\), where \(g[i][j]\) represents the number of consecutive \(1\)s from the \(j\)-th column to the left in the \(i\)-th row.
The time complexity is \(O(m^2 \times n)\), and the space complexity is \(O(m \times n)\). Here, \(m\) and \(n\) are the number of rows and columns of the matrix, respectively.