最大矩形
題目描述
給定一個僅包含 0 和 1 的二維二進制矩陣,找出只包含 1 的最大矩形,並返回其面積。
示例:
輸入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
輸出: 6
解題思路
個人AC
class Solution {
public int maximalRectangle(char[][] matrix) {
int rows = matrix.length;
if (rows == 0) return 0;
int cols = matrix[0].length;
int[] heights = new int[cols + 1];
int maxArea = 0;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
heights[c] = matrix[r][c] == '1' ? heights[c] + 1 : 0;
}
maxArea = Math.max(maxArea, largestRectangleArea(heights));
}
return maxArea;
}
public int largestRectangleArea(int[] heights) {
int maxArea = 0;
Stack<Integer> stack = new Stack<>();
int p = 0;
while (p < heights.length) {
//棧空入棧
if (stack.isEmpty()) {
stack.push(p);
p++;
} else {
int top = stack.peek();
//當前高度大於棧頂,入棧
if (heights[p] >= heights[top]) {
stack.push(p);
p++;
} else {
// 保存棧頂高度
int height = heights[stack.pop()];
// 左邊第一個小於棧頂柱子的下標
int leftLessMin = stack.isEmpty() ? -1 : stack.peek();
// 右邊第一個小於棧頂柱子的下標
int RightLessMin = p; // 當前柱子
// 計算面積
int area = (RightLessMin - leftLessMin - 1) * height;
maxArea = Math.max(area, maxArea);
}
}
}
return maxArea;
}
}
時間複雜度: ;
空間複雜度: 。
最優解
同上。