给定一个整型矩阵map,求最大的矩形区域为1的数量
题目:
给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的 所有矩形区域中,最大的矩形区域为1的数量。
例如:
1 1 1 0
其中,最大的矩形区域有3个1,所以返回3。
再如:
1 0 1 1
1 1 1 1
1 1 1 0
其中,最大的矩形区域有6个1,所以返回6。
解题思路:
如果矩阵的大小为O(N×M),本题可以做到时间复杂度为O(N×M)。 解法的具体过程为:
1.矩阵的行数为N,以每一行做切割,统计以当前行作为底的情况 下,每个位置往上的1的数量。使用高度数组height来表示。
例如:
map = 1 0 1 1
1 1 1 1
1 1 1 0
以第1行做切割后,height={1,0,1,1},height[j]表示目前的底上 (第1行),j位置往上(包括j位置)有多少连续的1。
以第2行做切割后,height={2,1,2,2},注意到从第一行到第二 行,height数组的更新是十分方便的,即height[j] = map[i][j]==0 ? 0 : height[j]+1。
以第3行做切割后,height={3,2,3,0}。
2.对于每一次切割,都利用更新后的height数组来求出以每一行为 底的情况下,最大的矩形是什么。那么这么多次切割中,最大的那个矩 形就是我们要的。
整个过程就是如下代码中的maxRecSize方法。步骤2的实现是如下代码中的maxRecFromBottom方法。
下面重点介绍一下步骤2如何快速地实现,这也是这道题最重要的部分,如果height数组的长度为M,那么求解步骤2的过程可以做到时间 复杂度为O(M)。
对于height数组,读者可以理解为一个直方图,比如{3,