题目 
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。1
2
3
2
3
示例 2:
输入:matrix = []
输出:01
2
2
示例 3:
输入:matrix = [["0"]]
输出:01
2
2
示例 4:
输入:matrix = [["1"]]
输出:11
2
2
示例 5:
输入:matrix = [["0","0"]]
输出:01
2
2
提示:
- rows == matrix.length
- cols == matrix[0].length
- 1 <= row, cols <= 200
- matrix[i][j]为- '0'或- '1'
题解 
java
public int maximalRectangle(char[][] matrix) {
    int rows, columns;
    if ((rows = matrix.length) == 0 || (columns = matrix[0].length) == 0) {
        return 0;
    }
    // 高度计算
    int[][] heights = new int[rows][columns];
    int result = 0;
    /**
     * 行最大面积
     * @see Solution84#largestRectangleArea(int[])
     */
    Function<int[], Integer> maxArea = hs -> {
        // 考虑使用二分法
        BiFunction<Integer, Integer, Integer> divide = new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer left, Integer right) {
                // 超过区间
                if (left > right) {
                    return 0;
                }
                // 找到当前区间最小值索引
                int mid = left;
                for (int i = left + 1; i <= right; i++) {
                    if (hs[i] < hs[mid]) {
                        mid = i;
                    }
                }
                return
                    Math.max(
                        // 计算当前区间最大面积
                        (right - left + 1) * hs[mid],
                        // 计算左右两边最大面积
                        Math.max(
                            this.apply(left, mid - 1),
                            this.apply(mid + 1, right)
                        )
                    );
            }
        };
        int length = hs.length;
        return length == 0 ? 0 : divide.apply(0, length - 1);
    };
    // 依次计算每行最大面积
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            // 只计算为1的部分
            if (matrix[i][j] == '1') {
                // 累加上一行同一列的高度
                heights[i][j] = i - 1 < 0 ? 1 : heights[i - 1][j] + 1;
            }
            // 否则 该点位面积为0
        }
        // 按照是否是1转换为高度数组
        // 列值累加 当前列为0 则高度为0
        int rowMax = maxArea.apply(heights[i]);
        if (rowMax > result) {
            result = rowMax;
        }
    }
    return result;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68