题:给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。
注意:此题 matrix 输入格式为一维 01 字符串数组。
function maximalRectangle(matrix) {
if (matrix.length === 0) return 0;
const m = matrix.length;
const n = matrix[0].length;
let maxArea = 0;
// 初始化高度数组(处理第一行)
const heights = new Array(n).fill(0);
for (let row of matrix) {
// 动态更新高度数组
for (let j = 0; j < n; j++) {
heights[j] = row[j] === '1' ? heights[j] + 1 : 0;
}
// 计算当前行的最大矩形面积
maxArea = Math.max(maxArea, largestRectangleArea(heights));
}
return maxArea;
}
// 柱状图最大面积算法
function largestRectangleArea(heights) {
let maxArea = 0;
const stack = [];
heights = [0, ...heights, 0];
for (let i = 0; i < heights.length; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
const cur = stack.pop();
const left = stack[stack.length - 1];
maxArea = Math.max(maxArea, (i - left - 1) * heights[cur]);
}
stack.push(i);
}
return maxArea;
}
// 测试用例
console.log(maximalRectangle(["10100","10111","11111","10010"])); // 输出 6
console.log(maximalRectangle(["1"])); // 输出 1
console.log(maximalRectangle(["1111","1111","1111"])); // 输出 12
关键步骤:
1、生成高度数组;
2、对每行高度应用柱状图算法
关键点说明
高度数组的构建:
每个位置的高度表示:从当前行向上连续1的个数
遇到0时高度重置为0(无法形成矩形)
复杂度分析:
时间复杂度:O(mn),每行处理需要O(n)时间
空间复杂度:O(n),只需存储当前行的高度数组
性能优势:
比暴力解法的O(m²n)效率提升显著
复用柱状图算法保证每行处理的效率