[LeetCode] 85. Maximal Rectangle(Hard)(JAVA)1日1つの質問

【LeetCode】85。最大長方形(ハード)(JAVA)

件名アドレス:https//leetcode.com/problems/maximal-rectangle/

タイトル説明:

0と1で満たされた行x列のバイナリ行列が与えられた場合、1のみを含む最大の長方形を見つけて、その面積を返します。

例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.

例2:

Input: matrix = []
Output: 0

例3:

Input: matrix = [["0"]]
Output: 0

例4:

Input: matrix = [["1"]]
Output: 1

例5:

Input: matrix = [["0","0"]]
Output: 0

制約:

  • 行== matrix.length
  • cols == matrix.length
  • 0 <=行、列<= 200
  • matrix [i] [j]は「0」または「1」です。

一般的なアイデア

0と1のみを含む2次元のバイナリ行列が与えられた場合、1のみを含む最大の長方形を見つけ、その面積を返します。

問題解決方法

この質問は、実際には前の質問に変えることができます:[LeetCode] 84.ヒストグラムの最大の長方形(ハード)(JAVA)

  1. 0の位置に遭遇したときの現在の行1の高さを計算します

  2. 現在の行の最大の長方形を計算します

  3. 注、84の問題解決策:1。現在の要素よりも小さい左側と右側の最初の位置を見つけます; 2。現在の要素の領域を見つけます

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) return 0;
        int[] heights = new int[matrix[0].length];
        int max = 0;
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (matrix[i][j] == '0') {
                    heights[j] = 0;
                } else {
                    heights[j]++;
                }
            }
            max = Math.max(max, mH(heights));
        }
        return max;
    }

    public int mH(int[] heights) {
        int[] left = new int[heights.length];
        int[] right = new int[heights.length];
        for (int i = 0; i < heights.length; i++) {
            int next = i - 1;
            while (next >= 0 && heights[i] <= heights[next]) {
                next = left[next] - 1;
            }
            left[i] = next + 1;
        }
        for (int i = heights.length - 1; i >= 0; i--) {
            int next = i + 1;
            while (next < heights.length && heights[i] <= heights[next]) {
                next = right[next] + 1;
            }
            right[i] = next - 1;
        }
        int max = 0;
        for (int i = 0; i < heights.length; i++) {
            max = Math.max(max, (right[i] - left[i] + 1) * heights[i]);
        }
        return max;
    }
}

実行時間:4ミリ秒、Javaユーザーの92.47%を上回っています
メモリ消費量:41.1 MB、Javaユーザーの86.40%を上回っています

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/111715065