博客
关于我
Leetcode 85. Maximal Rectangle
阅读量:301 次
发布时间:2019-03-03

本文共 3137 字,大约阅读时间需要 10 分钟。

题目概述

本题可以看作是复杂版的 Leetcode 84 Largest Rectangle in Histogram(最大的矩形面积)。我们需要将原始矩阵转换为每个位置的柱状图高度,然后利用最大柱状图方法计算每层的最大矩形面积,最后比较各层的面积,得出整体最大值。

解题思路

本题可以采用以下两种思路之一:
第一种思路:
将原始矩阵转换为每个位置的柱状图高度。具体方法是:

  • 创建一个辅助矩阵 calc,用于记录每个位置的柱状图高度。
  • 从矩阵中逐行处理,计算每个位置的柱状图高度。具体步骤如下:
    • 初始化 calc 矩阵,calc[i][j] 代表第 i 行第 j 列的柱状图高度。
    • 如果当前位置是 0,则 calc[i][j] 设为 0
    • 否则,calc[i][j] 设为 1,再加上上层的高度(如果存在的话)。
  • 对转换后的 calc 矩阵,使用最大柱状图算法计算每个柱状图的最大矩形面积。
  • 第二种思路:

    采用动态规划的思路,虽然具体实现细节与第一种方法较为相似,但核心思想是通过逐层累加高度来计算最大矩形面积。

    算法性能

    采用最大柱状图的单调栈方法,时间复杂度为 O(M*N),空间复杂度为 O(N)。该算法通过维护一个递减栈,记录当前柱状图的左边界和右边界,从而高效计算出每个柱状图的最大矩形面积。

    代码示例

    以下是基于单调栈方法的代码实现:

    public class Solution {    public int maximalRectangle(vector
    > matrix) { if (matrix.size() == 0) { return 0; } int lenRow = matrix.size(); int lenCol = matrix[0].size(); int maxArea = 0; // 创建辅助矩阵 int[][] calc = new int[lenRow][lenCol + 2]; for (int i = 0; i < lenRow; i++) { calc[i] = new int[lenCol + 2]; for (int j = 0; j < lenCol + 2; j++) { calc[i][j] = -lenCol * 2 + j; } } for (int ri = 0; ri < lenRow; ri++) { for (int ci = 1; ci <= lenCol; ci++) { calc[ri][ci] = (matrix[ri][ci - 1] == '0') ? 0 : 1; if (ri > 0 && calc[ri][ci] > 0 && calc[ri - 1][ci] > 0) { calc[ri][ci] += calc[ri - 1][ci]; } } } // 使用单调栈计算最大矩形面积 int[] rectStart = new int[lenCol + 2]; int[] rectEnd = new int[lenCol + 2]; ArrayFill(rectStart, 0, lenCol + 2); ArrayFill(rectEnd, 0, lenCol + 2); for (int ri = 0; ri < lenRow; ri++) { Deque
    stack = new ArrayDeque<>(); for (int ci = 0; ci < lenCol + 2; ci++) { int current = calc[ri][ci]; if (stack.isEmpty()) { stack.push(ci); rectStart[ci] = stack.peek(); rectEnd[ci] = ci; } else { int tempTop = stack.peek(); if (current > calc[ri][tempTop]) { stack.push(ci); rectStart[ci] = tempTop; rectEnd[ci] = ci; } else { while (!stack.isEmpty() && calc[ri][tempTop] > current) { int top = stack.pop(); rectEnd[top] = ci; int width = rectEnd[top] - rectStart[top] - 1; int height = calc[ri][top]; int area = width * height; if (area > maxArea) { maxArea = area; } } stack.push(ci); rectStart[ci] = stack.peek(); } } } } return maxArea; } // 初始化数组 private void ArrayFill(int[] array, int value, int length) { Arrays.fill(array, value); }}

    以上代码基于单调栈方法,通过维护一个递减栈来高效计算每个柱状图的最大矩形面积,时间复杂度为 O(M*N),空间复杂度为 O(N)。

    转载地址:http://wesm.baihongyu.com/

    你可能感兴趣的文章
    MySQL底层概述—6.索引原理
    查看>>
    MySQL底层概述—7.优化原则及慢查询
    查看>>
    MySQL底层概述—8.JOIN排序索引优化
    查看>>
    MySQL底层概述—9.ACID与事务
    查看>>
    Mysql建立中英文全文索引(mysql5.7以上)
    查看>>
    MySQL开源工具推荐,有了它我卸了珍藏多年Nactive!
    查看>>
    Mysql当前列的值等于上一行的值累加前一列的值
    查看>>
    MySQL当查询的时候有多个结果,但需要返回一条的情况用GROUP_CONCAT拼接
    查看>>
    MySQL必知必会(组合Where子句,Not和In操作符)
    查看>>
    MySQL必知必会总结笔记
    查看>>
    MySQL快速入门
    查看>>
    MySQL快速入门——库的操作
    查看>>
    mysql快速复制一张表的内容,并添加新内容到另一张表中
    查看>>
    mysql快速查询表的结构和注释,字段等信息
    查看>>
    mysql怎么删除临时表里的数据_MySQL中关于临时表的一些基本使用方法
    查看>>
    mysql性能优化
    查看>>
    MySQL性能优化必备25条
    查看>>
    Mysql性能优化(1):SQL的执行过程
    查看>>
    Mysql性能优化(2):数据库索引
    查看>>
    Mysql性能优化(3):分析执行计划
    查看>>