Given a rows x cols binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example 1:
**Input:** matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
**Output:** 6
**Explanation:** The maximal rectangle is shown in the above picture.
Example 2:
**Input:** matrix = []
**Output:** 0
Example 3:
**Input:** matrix = [["0"]]
**Output:** 0
Example 4:
**Input:** matrix = [["1"]]
**Output:** 1
Example 5:
**Input:** matrix = [["0","0"]]
**Output:** 0
Constraints:
rows == matrix.length
cols == matrix[i].length
0 <= row, cols <= 200
matrix[i][j] is '0' or '1'.
ac1: Stack
similar with #84
classSolution {publicintmaximalRectangle(char[][] matrix) {// edge casesif (matrix.length==0|| matrix[0].length==0) return0;int max =0;int row =matrix.length, col = matrix[0].length;int[] h =newint[col];// iterate rowfor (int r =0; r < row; r++) {for (int c =0; c < col; c++) { h[c] = matrix[r][c] =='1'? h[c] +1:0; } max =Math.max(max,maxArea(h)); // O(n) }return max; }privateintmaxArea(int[] h) {Stack<Integer> stack =newStack<Integer>();stack.push(-1);int max =0;for (int i =0; i <=h.length; i++) {int currh = i ==h.length?0: h[i];while (stack.peek() !=-1&& currh < h[stack.peek()]) { max =Math.max(max, h[stack.pop()] * (i -stack.peek() -1)); }stack.push(i); }return max; }}/*stack, similar with #84row by row: int[] h = new int[matrix[0].length] if [i] == 1, h[i] = h[i] + 1, otherwise h[i] = 0 calculate max area like #84*/