算法-js-最大矩形
题:给定一个由 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)效率提升显著
复用柱状图算法保证每行处理的效率