题目简介:
给你一个只包含 0 和 1 的 rows * columns
矩阵 mat
,请你返回有多少个 子矩形 的元素全部都是 1 。
示例 1:
1 | 输入:mat = [[1,0,1], |
示例 2:
1 | 输入:mat = [[0,1,1,0], |
示例 3:
1 | 输入:mat = [[1,1,1,1,1,1]] |
示例 4:
1 | 输入:mat = [[1,0,1],[0,1,0],[1,0,1]] |
提示:
1 <= rows <= 150
1 <= columns <= 150
0 <= mat[i][j] <= 1
思路:
周赛做自闭的一道题,结束后看了题解以后搞懂了,还是智商问题…
首先动态规划,计算每个点前面连续的1
的个数(行,包括自己),即dp[i][j] = dp[i][j - 1] + 1
,点为0的点不用计算,直接为0即可。
然后开始循环遍历,每次计算以mat[i][j]
为右下角的矩阵个数,并累加到sum
中。
然后关键的地方来了,如何计算矩阵个数呢?
我们定义一个min_len
来保存以mat[i][j]
所在列元素的dp[i][j]
,即dp[i ... 0][j]
。也就是每次保存构成矩阵的最小长度。
举个例子吧,如下图的矩阵,我们现在计算以mat[3][2]
为右下角所构成的矩阵。
1 | [0,0,1] |
首先是第四行,dp[3][2] = 3
,所以最小长度为3,所以sum += 3
,这里计算的矩阵是只有第四行元素构成的矩阵,如下所示:
1 | [1,1,1], [1,1], [1] |
向上遍历,第三行时,dp[2][2] = 3
,最小长度依然为3,sum += 3
,这里计算的矩阵是第三、四行元素构成的矩阵,如下所示:
1 | [1] [1,1] [1,1,1] |
继续向上遍历,第二行时,dp[1][2] = 2
,此时的最小长度变为2,sum += 2
,这里计算的矩阵是第二、三、四行元素构成的矩阵,如下所示:
1 | [1] [1][1] |
继续向上遍历,第一行时,dp[0][2] = 1
,此时的最小长度变为1,sum += 1
,这里计算的矩阵是第一、二、三、四行元素构成的矩阵,如下所示:
1 | [1] |
该点遍历结束。
循环结束后返回sum
即可。
tip:
- 先初始化
dp[i][0]
,处理边界问题。
代码如下:
1 | class Solution { |