【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)
-
0の位置に遭遇したときの現在の行1の高さを計算します
-
現在の行の最大の長方形を計算します
-
注、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%を上回っています