求最大子矩阵的大小
题目
给定一整型矩阵,其中的值只有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(M* N)
求解思路:
-
以每一行进行切割。
1.切割,统计以当前行作为底的情况下,每个位置上1的数量。
2.用height数组进行存储。 -
求解每行的最大矩形的面积。
把每一行看作是矩形柱,然后将其向左向右进行扩展,扩展的原则就是:只能够柱子高度低的向柱子高度高的方向扩展,如果左侧不存在就不能够进行扩展。矩形的面积就是矩形柱子的高度乘以其对对应的可扩展的宽度。 -
在进行考察柱子最大能够扩多大?问题的本质就是找柱子左边离它最近且比它小的柱子的位置在哪里,以及右侧离它最近且比它小的柱子位置在哪里。解决这个问题利用单调栈可以快速进行求解。单调栈结构及应用
代码
import java.util.Stack;
public class Code_03_maxRectangle {
public static int maxRecSize(int[][] map){
if (map == null || map.length == 0 || map[0].length == 0){
return 0;