Files
obsidian/АиСД/Задачи/LeetCode/Maximal Rectangle.md
T
roma-dxunvrs 00b700a410 14.09.26
2026-09-14 20:07:06 +03:00

2.3 KiB

Leetcode #85 | #Hard | Монотонный стек | Матрица

Идея

Продолжение Largest Rectangle In Histogram, но эту гистограмму надо построить. Заводим массив высот, идем по строкам. Для каждой строки обновляем массив - если в столбце 0, то ставим 0, если в столбце 1, то инкрементируем эту высоту в нашем массиве. Теперь вызываем метод из прошлой задачи на текущее состояние массива высот.

Big-O

  • Время O(NM)
  • Память O(M) N - кол-во строк, M - кол-во столбцов

Код

class Solution {
    public int maximalRectangle(char[][] matrix) {
        Deque<Integer> 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<Integer> 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;
    }
}