Leetcode #85 | #Hard | [[Монотонный стек]] | [[Матрица]] ## Идея Продолжение [[Largest Rectangle In Histogram]], но эту гистограмму надо построить. Заводим массив высот, идем по строкам. Для каждой строки обновляем массив - если в столбце 0, то ставим 0, если в столбце 1, то инкрементируем эту высоту в нашем массиве. Теперь вызываем метод из прошлой задачи на текущее состояние массива высот. ## [[Big-O]] - Время ```O(NM)``` - Память ```O(M)``` N - кол-во строк, M - кол-во столбцов ## Код ```Java class Solution { public int maximalRectangle(char[][] matrix) { Deque stack = new ArrayDeque<>(); int[] heights = new int[matrix[0].length]; int res = 0; for (int r = 0; r < matrix.length; r++) { for (int c = 0; c < matrix[0].length; c++) { if (matrix[r][c] == '0') { heights[c] = 0; } else { heights[c] += 1; } } res = Math.max(res, getLargestRectangle(heights, stack)); } return res; } int getLargestRectangle(int[] heights, Deque stack) { int res = 0; stack.clear(); for (int i = 0; i < heights.length; i++) { while (stack.size() > 0 && heights[i] < heights[stack.peek()]) { int height = heights[stack.pop()]; int weight; if (stack.size() == 0) { weight = i; } else { weight = i-stack.peek()-1; } res = Math.max(res, height*weight); } stack.push(i); } while (stack.size() > 0) { int height = heights[stack.pop()]; int weight; if (stack.size() == 0) { weight = heights.length; } else { weight = heights.length-stack.peek()-1; } res = Math.max(res, height*weight); } return res; } } ```