全部由1组成的子矩形的数量

题目描述:

给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩阵的数量。

way:

假设我们遍历矩形的每一行,以当前遍历到的行作为地基,去看这一行的直方图(直方图介绍 ->直方图的最大长方形面积-CSDN博客)中全部由1组成的子矩阵的个数,将每一行得到的子矩阵数加起来,得到答案,将二维问题转变为了一维问题,所以就是像下面这样。

第一行:1 1 1 1  0 1

第二行:2 2 2 2  0 2 

第三行:3 3 3 3  1 3

第四行:   0 4 4 4  2 4 (做地基时如果有0直接为0,地基都没有,上面的没法垒起来的)

第五行:1 5 0 5  3 5

为了明显点,假设这5行中的有一行是 3, 2, 4, 2, 5,那么计算这一行的直方图的子矩阵的数量就是,以当前行的每个元素作为所在子矩阵中的最小高度,得到一块区域,假设以第4个2作为最低高度,那么可以得到如下的一块区域,在这个区域中,对于高度为2的子矩阵的数量,有1-1列,1-2列,1-3列,1-4列,1-5列,2-2列,2-3,2-4,2-5,3-3,3-4,3-5,4-4,4-5,5-5 这(1+5)*5/2=15个,对于高度为1的数量,也有15个,所以如果区域长度为L,高度为h,那么子矩阵的数量就是  L * (L+1)/2 * h 个,对于上面说的,有 5 *(5+1)/2 *2 = 30个,这个高度h为当前选的最低高度 - max(left, right) (left,right 分别为它的左右两边离它最近且比它 小于or等于 的数,就像第一个2,左边比它小的数没有,右边比它 等于 的数是第2个2,然后h=2-2=0, 没有计算以第一个2为最小高度时的子矩阵数,到了第2个2的时候,左边比它小的数没有,右边比它小的数也没有,h=2-0=2, 到了第2个2的时候才计算了下面的阴影部分的子矩阵的数量,这样就不会算重复,只会在最后一个2的时候去计算以2为最低高度的时候那块高度为2连通的大区域的子矩阵数,必须是 小于等于,必须是 h = 高度差,这样就不会在 最低高度 =3 的时候去计算高度为2的子矩阵数,那样高度为2的区域其实还没有完全连起来形成一块大区域,会算重)。注意要一行一行的做地基 (地基必被算)得到一个个直方图数组去算去加和,其实你按我上面的说法1-1,1-2,1-3....,不同高度这样一行一行的去算就知道对不对了。

#include<iostream>
#include<vector>
#include<stack>
using namespace std;int subMatrixCount(vector<int> height)
{int N = height.size();stack<int>st;int num = 0;for (int i = 0; i < N; i++){while (!st.empty() && height[i] <= height[st.top()]){int topIndex = st.top();st.pop();int leftIndex = st.empty() ? -1 : st.top();int rightIndex = i;//(rightIndex-1)-(leftIndex+1) + 1int L = rightIndex - 1 - leftIndex;int h = height[topIndex] - max(height[rightIndex], leftIndex >= 0 ? height[leftIndex] : 0);num += L * (L + 1) / 2 * h;}st.push(i);}while (!st.empty()){int topIndex = st.top();st.pop();int leftIndex = st.empty() ? -1 : st.top();int rightIndex = N;//(rightIndex-1)-(leftIndex+1) + 1int L = rightIndex - 1 - leftIndex;int h = height[topIndex] - max(0, leftIndex >= 0 ? height[leftIndex] : 0);num += L * (L + 1) / 2 * h;}return num;
}int allSubMatrixCountBy1(vector<vector<char>> mp)
{if (mp.size() == 0) return 0;int M = mp.size();int N = mp[0].size();vector<int>row(N);int sum = 0;for (int i = 0; i < M; i++){for (int j = 0; j < N; j++){if (mp[i][j] == '1'){row[j] += 1;}else{row[j] = 0;}}sum += subMatrixCount(row);}return sum;
}int main()
{vector<vector<char>> mp = {{'1', '1'},{'1', '1'}};int sum = allSubMatrixCountBy1(mp);cout << sum << endl;  //9return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.3.3 QGIS点类型注释(Annotation)的应用与二次开发实现

文章目录 前言注释(Annotation)图层QGis中的注释(Annotation)图层二次开发实现线段类型注释(Annotation)点类型Item 总结 前言 介绍注释(Annotation)图层在QGis中的使用以及二次开发的实现说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 注释(Annotation)…

【Unity实战100例】Unity声音可视化多种显示效果

目录 一、技术背景 二、界面搭建 三、 实现 UIAudioVisualizer 基类 四、实现 AudioSampler 类 五、实现 IAudioSample 接口 六、实现MusicAudioVisualizer 七、实现 MicrophoneAudioManager 类 八、实现 MicrophoneAudioVisualizer 类 九、源码下载 Unity声音可视化四…

firefly rk3288 解决刷入Linux固件后mac地址一样的问题

原理&#xff1a;使用cpuid生成mac地址 1、修改u-boot/net/eth_common.c里的eth_env_set_enetaddr函数为&#xff1a; int eth_env_set_enetaddr(const char *name, const uchar *enetaddr) {char buf[ARP_HLEN_ASCII 1];sprintf(buf, "%pM", enetaddr);return en…

代码随想录算法训练营第九天 |LeetCode151.翻转字符串里的单词 卡码网:55.右旋转字符串

代码随想录算法训练营 Day 9 代码随想录算法训练营第九天 |LeetCode151.翻转字符串里的单词 卡码网&#xff1a;55.右旋转字符串 目录 代码随想录算法训练营前言LeetCode151.翻转字符串里的单词卡码网&#xff1a;55.右旋转字符串 一、LeetCode151.翻转字符串里的单词1.题目链…

laravel为Model设置全局作用域

如果一个项目中存在这么一个sql条件在任何情况下或大多数情况都会被使用&#xff0c;同时很容易被开发者遗忘&#xff0c;那么就非常适用于今天要提到的这个功能&#xff0c;Eloquent\Model的全局作用域。 首先看一个示例&#xff0c;有个数据表&#xff0c;结构如下&#xff1…

运行sudo apt install net-tools时显示无法定位软件包

当你在 Ubuntu 或基于 Debian 的系统上运行 sudo apt install net-tools 并收到“无法定位软件包”的错误时&#xff0c;这通常意味着你的系统可能没有正确配置软件源&#xff0c;或者软件源中没有提供 net-tools 包。以下是一些可能的解决方案&#xff1a; 1. 更新软件源列表…

java设计模式:03-结构型模式-概览

结构型模式&#xff08;Structural Patterns&#xff09; 结构型模式&#xff08;Structural Patterns&#xff09;主要关注类和对象的组合方式&#xff0c;旨在通过不同的结构组合方式来建立新的功能。结构型模式可以帮助开发者确保即使对象组合方式改变&#xff0c;也能保持…

一款国外开发的高质量WordPress下载站模板主题

5play下载站是由国外站长开发的一款WordPress主题&#xff0c;主题简约大方&#xff0c;为v1.8版本&#xff0c; 该主题模板中包含了上千个应用&#xff0c;登录后台以后只需要简单的三个步骤就可以轻松发布apk文章&#xff0c; 我们只需要在WordPress后台中导入该主题就可以…

大模型应用如何点燃?

▎****尽管在中国&#xff0c;关于大模型的商业模式的讨论尚显早期&#xff0c;但智能体&#xff0c;尤其是专业智能体&#xff0c;蕴藏着巨大的潜力。 ChatGPT 还没有颠覆世界。 身处“第三次信息革命”&#xff0c;很多人被浓烈的FOMO&#xff08;Fear of Missing Out&…

昇思25天学习打卡营第12天 | ResNet50图像分类

ResNet50在CIFAR-10数据集上的图像分类实践 在深入学习和实践使用ResNet50进行CIFAR-10数据集上的图像分类后&#xff0c;我对深度学习模型的构建、训练和优化有了更深刻的理解。本次学习经历涵盖了从理论探索到实际应用的全过程&#xff0c;以下是我的主要收获和反思。 1. 理…

(南京观海微电子)——电感的电路原理及应用区别

电感 电感是导线内通过交流电流时&#xff0c;在导线的内部及其周围产生交变磁通&#xff0c;导线的磁通量与生产此磁通的电流之比。 当电感中通过直流电流时&#xff0c;其周围只呈现固定的磁力线&#xff0c;不随时间而变化&#xff1b;可是当在线圈中通过交流电流时&am…

Jump Point Search(JPS)算法与A*算法

A* A*算法本质上讲是结合了DFS和BFS&#xff0c;针对当前起点先做一次BFS&#xff0c;再针对搜索的八个点做一次DFS BFS--广度优先算法&#xff08;Breadth First Search&#xff09; DFS A* 算法思想 A*的核心思想就是先进行一次BFS搜索&#xff0c;然后从这次BFS中找到距离…

python Requests库7种主要方法及13个控制参数(实例实验)

文章目录 一、Requests库的7种主要方法二、kwargs:控制访问的13个参数 一、Requests库的7种主要方法 序号方法说明1requests.request()&#xff1a;提交一个request请求&#xff0c;作为其他请求的基础2requests.get()&#xff1a;获取HTML网页代码的方法3requests.head()&…

MongoDB 基本查询语句

基本查询 查询所有文档&#xff1a; db.collection.find()示例&#xff1a; db.users.find()按条件查询文档&#xff1a; db.collection.find({ key: value })示例&#xff1a; db.users.find({ age: 25 })查询并格式化输出&#xff1a; db.collection.find().pretty()示例&…

基于重要抽样的主动学习不平衡分类方法ALIS

这篇论文讨论了数据分布不平衡对分类器性能造成的影响,并提出了一种新的有效解决方案 - 主动学习框架ALIS。 1、数据分布不平衡会影响分类器的学习性能。现有的方法主要集中在过采样少数类或欠采样多数类,但往往只采用单一的采样技术,无法有效解决严重的类别不平衡问题。 2、论…

9种二极管及其特点总结

二极管种类和特点 名字特点恒流二极管近些年出现&#xff0c;电压大于某个值&#xff0c;电流恒定&#xff0c;一般用于led普通二极管低频整流和续流&#xff0c;便宜&#xff0c;反向恢复时间us级别&#xff0c;PN结肖特基二极管比普通二极管反向关断更快&#xff0c;10ns级别…

ARM/Linux嵌入式面经(十八):TP-Link联洲

文章目录 虚拟内存,页表,copy on write面试题1:面试题2:面试题3:进程和线程的区别红黑树和b+树的应用红黑树的应用B+树的应用视频会议用了哪些协议1. H.323协议2. SIP协议(会话发起协议)3. WebRTC(网页实时通信)4. 其他协议io多路复用(select,poll,epoll)面试题li…

智能硬件——0-1开发流程

文章目录 流程图1. 市场分析具体分析 2. 团队组建2. 团队组建早期团队配置建议配置一&#xff1a;基础型团队 (4人)配置二&#xff1a;扩展型团队 (6人)配置三&#xff1a;全面型团队 (7人) 3. 产品需求分析4. ID设计&#xff08;Industrial Design, 工业设计&#xff09;5. 结…

阿里云公共DNS免费版自9月30日开始限速 企业或商业场景需使用付费版

本周阿里云发布公告对公共 DNS 免费版使用政策进行调整&#xff0c;免费版将从 2024 年 9 月 30 日开始按照请求源 IP 进行并发数限制&#xff0c;单个 IP 的请求数超过 20QPS、UDP/TCP 流量超过 2000bps 将触发限速策略。 阿里云称免费版的并发数限制并非采用固定的阈值&…

一次Mysql报错:too many connections 的排查

某次出现了mysql too many connections 的报错&#xff0c; 管理后台无法进入了&#xff0c; 经查&#xff0c; show variables like "%max_connect%" 最大连接数是150 查当前连接数 show status like "%Threads_connected%" 当前连接数152&#xf…