[LintCode] Maximal Rectangle 最大矩形

简介:

Given a 2D boolean matrix filled with False and True, find the largest rectangle containing all True and return its area.

Example
Given a matrix:

[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
return 6.

LeetCode上的原题,请参见我之前的博客Maximal Rectangle

解法一:

class Solution {
public:
    /**
     * @param matrix a boolean 2D matrix
     * @return an integer
     */
    int maximalRectangle(vector<vector<bool> > &matrix) {
        if (matrix.empty() || matrix[0].empty()) return 0;
        int res = 0, m = matrix.size(), n = matrix[0].size();
        vector<int> h(n + 1, 0);
        for (int i = 0; i < m; ++i) {
            stack<int> s;
            for (int j = 0; j < n + 1; ++j) {
                if (j < n) {
                    if (matrix[i][j]) ++h[j];
                    else h[j] = 0;
                }
                while (!s.empty() && h[s.top()] >= h[j]) {
                    int cur = s.top(); s.pop();
                    res = max(res, h[cur] * (s.empty() ? j : (j - s.top() - 1)));
                }
                s.push(j);
            }
        }
        return res;
    }
};

解法二:

class Solution {
public:
    /**
     * @param matrix a boolean 2D matrix
     * @return an integer
     */
    int maximalRectangle(vector<vector<bool> > &matrix) {
        if (matrix.empty() || matrix[0].empty()) return 0;
        int res = 0, m = matrix.size(), n = matrix[0].size();
        vector<int> h(n, 0), left(n, 0), right(n, n);
        for (int i = 0; i < m; ++i) {
            int cur_left = 0, cur_right = n;
            for (int j = 0; j < n; ++j) {
                h[j] = matrix[i][j] ? h[j] + 1 : 0;
            }
            for (int j = 0; j < n; ++j) {
                if (matrix[i][j]) left[j] = max(left[j], cur_left);
                else {left[j] = 0; cur_left = j + 1;}
            }
            for (int j = n - 1; j >= 0; --j) {
                if (matrix[i][j]) right[j] = min(right[j], cur_right);
                else {right[j] = n; cur_right = j;}
            }
            for (int j = 0; j < n; ++j) {
                res = max(res, (right[j] - left[j]) * h[j]);
            }
        }
        return res;
    }
};

本文转自博客园Grandyang的博客,原文链接:最大矩形[LintCode] Maximal Rectangle ,如需转载请自行联系原博主。

相关文章
|
域名解析 网络协议 安全
CDN的基本概念介绍
CDN的基本概念介绍
523 0
|
Web App开发 Go iOS开发
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)
|
机器学习/深度学习 编解码 算法
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】
YOLOv8在小目标检测上存在挑战,因卷积导致信息丢失。本文教程将原网络结构替换为更适合小目标检测的backbone,并提供结构图。通过讲解原理和手把手教学,指导如何修改代码,提供完整代码实现,适合新手实践。文章探讨了大特征图对小目标检测的重要性,如细节保留、定位精度、特征丰富度和上下文信息,并介绍了FPN等方法。YOLOv8流程包括预处理、特征提取、融合和检测。修改后的网络结构增加了上采样和concatenate步骤,以利用更大特征图检测小目标。完整代码和修改后的结构图可在文中链接获取。
|
数据处理 流计算 Docker
实时计算 Flink版产品使用问题之进行数据处理时,怎么确保维度的更新在逻辑处理之后进行
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 C语言
C语言赋值语句
C语言赋值语句
342 1
|
JavaScript
Vue框架学习(第十三课)Vuex状态管理中的store和state属性
Vue框架学习(第十三课)Vuex状态管理中的store和state属性
349 0
|
弹性计算 数据采集 前端开发
阿里云服务器1核2GB5M配置仅需201元/年
阿里云活动出现了一款性价比极高的云服务器,1核2GB 5M只要201元 。明星机型——售价91元的1核2GB 1Mb的T5型云服务器。两款云服务器价格都非常便宜,但我这边强烈推荐大家买5M带宽的云服务器。
|
Oracle 关系型数据库 MySQL
MYSQL和ORACLE时区设置比较
MYSQL: 注意时区会影响TIMESTAMP的取值,默认为系统时区为TIME_ZONE=SYSTEM, 动态可以修改 set global  time_zone = '+8:00';  然后 my.
1237 0
|
19小时前
|
云安全 人工智能 自然语言处理