【算法奥义】最大矩形问题

首先建立一个二维数组,这个二维数组,计算出矩阵的每个元素的左边连续 1 的数量,使用二维数组 left记录,其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。

也就是从这个元素开始,从右往左边数有多少个连续为1,那么这个元素就是多少。

整理出该数组后,需要再次进行遍历,找出此行之前的行中,也就是left[i-1][j]的长度,然后只有选出最小的,才能与后面的行组成矩形,继续遍历之前的每次选出最小width,就可以了。

下面展示 cpp代码

cpp 复制代码
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int m = matrix.size();
        if (m == 0) {
            return 0;
        }
        int n = matrix[0].size();
        vector<vector<int>> left(m, vector<int>(n, 0));

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    left[i][j] = (j == 0 ? 0: left[i][j - 1]) + 1;
                }
            }
        }

        int ret = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '0') {
                    continue;
                }
                int width = left[i][j];
                int area = width;
                for (int k = i - 1; k >= 0; k--) {
                    width = min(width, left[k][j]);
                    area = max(area, (i - k + 1) * width);
                }
                ret = max(ret, area);
            }
        }
        return ret;
    }
};
相关推荐
意疏1 小时前
深入解析MySQL Join算法原理与性能优化实战指南
mysql·算法·性能优化
菜鸟小九1 小时前
Leetcode20 (有效的括号)
java·数据结构·算法
N_NAN_N2 小时前
[蓝桥杯 2024 国 Python B] 设计
java·数据结构·算法·并查集
量子-Alex2 小时前
【DETR目标检测】ISTD-DETR:一种基于DETR与超分辨率技术的红外小目标检测深度学习算法
深度学习·算法·目标检测
SundayBear2 小时前
适合有C基础后快速上手C++
开发语言·c++
顾三殇3 小时前
【自考】《计算机信息管理课程实验(课程代码:11393)》华师自考实践考核题型解析说明:C++ 与 mysql 实践题型与工具实践题分析
c++·mysql·华师自考实践考核题型分析
小猫咪怎么会有坏心思呢3 小时前
华为OD机试-猴子爬山-dp(JAVA 2025A卷)
java·算法·华为od
酷爱码3 小时前
Python虚拟环境与Conda的使用方式详解
开发语言·python·算法
newki3 小时前
【NDK】项目演示-Android串口的封装工具库以及集成的几种思路
android·c++·app
whoarethenext3 小时前
使用 C++ 和 OpenCV 构建智能答题卡识别系统
开发语言·c++·opencv