classSolution{int m;int n;publicintmaximalRectangle(char[][] matrix){int res =0;
m = matrix.length;
n = matrix[0].length;// 存储每个位置从下到上纵向的高度int[][] arr =fillArr(matrix);for(int i =0; i < m; i++){int area =rowMaximalRectangle(arr[i]);
res =Math.max(res, area);}return res;}publicintrowMaximalRectangle(int[] heights){int area =0;// 单调递增栈,存储的是heights下标Deque<Integer> dq =newArrayDeque<>();for(int i =0; i < heights.length; i++){// 当栈底高度大于当前高度,说明找到了栈底柱子的最大矩形while(!dq.isEmpty()&& heights[dq.peekLast()]> heights[i]){int idx = dq.pollLast();int l = dq.isEmpty()?-1: dq.peekLast();int r = i;
area =Math.max(area, heights[idx]*(r - l -1));}
dq.offerLast(i);}// 栈中的剩余元素都是单调递增栈,与右边界组成矩形while(!dq.isEmpty()){int idx = dq.pollLast();int l = dq.isEmpty()?-1: dq.peekLast();int r = heights.length;
area =Math.max(area, heights[idx]*(r - l -1));}return area;}publicint[][]fillArr(char[][] matrix){int[][] arr =newint[m][n];for(int j =0; j < n; j++){if(matrix[0][j]=='1'){
arr[0][j]=1;}}for(int i =1; i < m; i++){for(int j =0; j < n; j++){if(matrix[i][j]=='1'){
arr[i][j]= arr[i -1][j]+1;}}}return arr;}}