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

本文共 3203 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Webpack 基本环境搭建
    查看>>
    mysql5.7 安装版 表不能输入汉字解决方案
    查看>>
    MySQL5.7.18主从复制搭建(一主一从)
    查看>>
    MySQL5.7.19-win64安装启动
    查看>>
    mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
    查看>>
    MySQL5.7.37windows解压版的安装使用
    查看>>
    mysql5.7免费下载地址
    查看>>
    mysql5.7命令总结
    查看>>
    mysql5.7安装
    查看>>
    mysql5.7性能调优my.ini
    查看>>
    MySQL5.7新增Performance Schema表
    查看>>
    Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
    查看>>
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>