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

首先建立一个二维数组,这个二维数组,计算出矩阵的每个元素的左边连续 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;
    }
};
相关推荐
玩转单片机与嵌入式13 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
历程里程碑13 小时前
4 Git远程协作:从零开始,玩转仓库关联与代码同步(带实操代码讲解)
大数据·c++·git·elasticsearch·搜索引擎·gitee·github
梦想画家13 小时前
Apache AGE实战指南:从Cypher语法到核心图算法
算法·cypher·apache age
刀法如飞13 小时前
Go数组去重的20种实现方式,AI时代解决问题的不同思路
后端·算法·go
汉克老师14 小时前
GESP5级C++考试语法知识(贪心算法(一)课堂例题精讲)
c++·贪心算法·gesp5级·gesp五级·贪心规律
墨染千千秋14 小时前
C++头文件的使用,和各个头文件与头文件用处
c++
呱呱巨基14 小时前
Linux 基础IO
linux·c++·笔记·学习
旖-旎14 小时前
深搜练习(N皇后)(10)
c++·算法·深度优先·力扣
Controller-Inversion15 小时前
322. 零钱兑换
算法
头发够用的程序员15 小时前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试