85 Maximal rectangle
https://leetcode.com/problems/maximal-rectangle/
čŋééĸįŽæ¯čĄæå¤§éĸ᧝į¨åč°æ äŧåŋĢåžå¤
class Solution {
public int maximalRectangle(char[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
if (i == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i-1][j] + 1;
}
}
}
}
int ans = 0;
for (int i = 0; i < m; i++) {
int[] heights = dp[i];
ans = Math.max(ans, getMax(heights));
}
return ans;
}
private int getMax(int[] heights) {
int ans = 0;
int n = heights.length;
int[] arr = new int[n+2];
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
arr[i+1] = heights[i];
}
stack.push(0);
for (int i = 1; i <= n + 1; i++) {
if (arr[stack.peek()] <= arr[i]) {
stack.push(i);
} else {
while (arr[stack.peek()] > arr[i]) {
int curidx = stack.pop();
int curhei = arr[curidx];
ans = Math.max(ans, curhei*(i-stack.peek()-1));
}
stack.push(i);
}
}
return ans;
}
}
Last updated