classSolution { publicintmaximalRectangle(char[][] matrix){ int rows = matrix.length; if (rows == 0) return0; int cols = matrix[0].length; int [][]arr = newint[rows][cols+1]; for (int i = 0; i < rows; ++i) { arr[i][0] = 0; } for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (matrix[i][j] == '1') arr[i][j+1] = arr[i][j]+1; else arr[i][j+1] = 0; } } int max = 0; int tmpx=-1, tmpy=-1; for (int i = 0; i < rows; ++i) { for (int j = 1; j < cols+1; ++j) { if (arr[i][j] != 0) { int height = 2; int mi = arr[i][j]; max = mi > max ? mi : max; for (int tmp = i-1; tmp >= 0; --tmp) { mi = Math.min(arr[tmp][j], mi); int val = mi * height; max = val > max ? val : max; ++height; if (max == 25) { tmpx = i; tmpy = j; } } } } } return max; } }
class Solution { public int maximalRectangle(char[][] matrix) { int rows = matrix.length; if (rows == 0) return 0; int cols = matrix[0].length; int [][]arr = new int[rows][cols+1]; for (int i = 0; i < rows; ++i) { arr[i][0] = 0; } for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (matrix[i][j] == '1') arr[i][j+1] = arr[i][j]+1; else arr[i][j+1] = 0; } } int max = 0; for (int i = 1; i < cols+1; ++i) { int []left = new int[rows]; int []right = new int[rows]; for (int k = 0; k < rows; ++k) { right[k] = rows; // 初始值为rows } Deque<Integer> stack = new LinkedList<Integer>(); for (int j = 0; j < rows; ++j) { while (!stack.isEmpty() && arr[stack.peek()][i] >= arr[j][i]) { right[stack.peek()] = j; // 优化成一次遍历 stack.pop(); } left[j] = (stack.isEmpty() ? -1 : stack.peek()); stack.push(j); } for (int k = 0; k < rows; ++k) { int tmp = (right[k]-left[k]-1) * arr[k][i]; max = tmp > max ? tmp : max; } } return max; } }