单调栈练习(四)— 统计全 1 子矩形

题目
同样的LeetCode原题:题目链接

给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。

在这里插入图片描述

单调栈
解题思路整体和上一篇文章差不多,都是用到了压缩数组的技巧,通过压缩数组来构建一个数组矩阵、以每一行为底, 每一列作为矩阵的高度,区别在于上一篇帖子是计算求矩阵的最大面积矩阵面积。而这道题是统计所有子矩阵个数。

所以这道题的区别在于,当遍历压缩数组时,以栈中弹出栈顶元素(cur)作为矩阵的高,并找到左右最近且小的值作为边界后。还要找到左右最近且小的值中的较大值(max)作为限制。只求 max ~ cur中的子矩阵的数量。

以下图为例,当前弹出的数组下标6的元素,高为6,左侧最近且小的值是在数组下标为3、高为3的值,右侧最近且小是在数组下标为9、高为4的值。
在这里插入图片描述
我们想求的是什么?
数组下标 4 ~ 8范围内。高度为5的子矩阵有多少, 高度为6的子矩阵有多少?也就是说,因为左右边界里,数组下标9的高度4 > 数组下标3的高度3。所以我们以4作为一个限制条件,只求范围内 > 4的子矩阵的个数。
其余 <= 4 那部分的子矩阵,等到下标9的元素弹出来时再算,这样算不会重复!!!
那4 ~ 8 范围内以5、6为高的子矩阵有多少?
一共有这些:(9 - 3) * (9 - 3 - 1) / 2 = 15
在这里插入图片描述
代码

public static int numSubmat(int[][] mat) {if (mat == null || mat[0].length == 0) {return 0;}int N = mat.length;int M = mat[0].length;int[] helpArr = new int[M];Integer sum = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {helpArr[j] = mat[i][j] == 0 ? 0 : helpArr[j] + 1;}sum += countFromBottom(helpArr);}return sum;}public static int countFromBottom(int[] height) {Stack<Integer> stack = new Stack<>();Integer sum = 0;for (int i = 0; i < height.length; i++) {while (!stack.isEmpty() && height[i] < height[stack.peek()]) {Integer cur = stack.pop();Integer leftMinIndex = stack.isEmpty() ? -1 : stack.peek();int n = i - leftMinIndex - 1;int max = Math.max(leftMinIndex == -1 ? 0 : height[leftMinIndex], height[i]);sum += (height[cur] - max) * num(n);}stack.push(i);}while (!stack.isEmpty()) {Integer cur = stack.pop();Integer leftMinIndex = stack.isEmpty() ? -1 : stack.peek();int n = height.length - leftMinIndex - 1;sum += (height[cur] - (leftMinIndex == -1 ? 0 : height[leftMinIndex])) * num(n);}return sum;}public static int num(int n) {return ((n * (1 + n)) >> 1);}

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

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

相关文章

python代码学习

图像归一化处理&#xff1a; 在代码中看到图像的2种处理方式&#xff1a; img/255.0image image/ 255img/127.5 - 1 image (image-127.5 )/ 127.5 第一种是对图像进行归一化&#xff0c;范围为[0, 1]&#xff0c;第二种也是对图像进行归一化&#xff0c;范围为[-1, 1]&am…

记录仪可作为XCP从站进行数据转发

车辆数据采集系统通常包含多种数据采集设备、多路总线或传感器信号&#xff0c;为了集中监控和管理&#xff0c;需要将这些设备的实时数据传输到上位机。对此&#xff0c;我们将使用基于XCP&#xff08;Universal Measurement and Calibration Protocol&#xff09;协议的数据记…

HDFS相关API操作

文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档&#xff1a;https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径&#xff08;例如D:…

在线图表编辑工具Draw.io本地部署并结合内网穿透实现远程协作办公

前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0c;并且因为其功能强大&#xff0c;导致安装需要很多的系统内存&#xff0c;并且是不可跨平台使用。所以&#xff0c;今天给…

PHP开发日志 ━━ 不同方法判断某个数组中是否存在指定的键名,测试哪种方法效率高

我们可以用isset($arr[a]) 或者 array_key_exists(a, $arr) 来判断a键名是否存在与$arr数组。 那么这两种方式哪个运行速度快呢&#xff1f; 不多废话了&#xff0c;现在我们写一段代码来测试一下&#xff1a; $array [a > 1, b > 2, c > 3];$start microtime(tru…

如何让软文获取更多流量?

软文推广作为大中小企业常用的推广方式&#xff0c;能够提高品牌形象&#xff0c;打造企业知名度、促进产品转化方面有着非常不错的效果&#xff0c;而且成本较低&#xff0c;风险较小。但有许多企业不清楚软文营销到底怎么做才能获得更多流量&#xff0c;今天媒介盒子就来和大…

Zookeeper+Kafka概述

一 Zookeeper 1.1 Zookeeper定义 Zookeeper是一个开源的、分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1.2 Zookeeper特点 Zookeeper&#xff1a;一个领导者&#xff08;leader&#xff09;&#xff0c;多个跟随者&#xff08;Follower&#xff09;组成的…

视频内容的创作要领有哪些?

1. 垂直领域内容输出 作为视频发布者&#xff0c;我们需要确保动态内容与账号定位相匹配&#xff0c;并专注于垂直领域。通过长期稳定的内容输出&#xff0c;我们可以提高账户权重&#xff0c;吸引到更多且更为精确的粉丝流量。确保内容的质量和相关性&#xff0c;将有助于提高…

Python 黑名单IP绕过(127.0.0.1绕过)Payload代码

目录 需求 代码 需求 1. 绕过防护工具中设置的黑名单IP 2. IP包含各种外网IP、局域网IP、127.0.0.1 代码 import socket import structdef ip_default_local(ips, ip):ips.add("127.0.0.1")ips.add("0.0.0.0")ips.add("localhost")def ip_d…

haiku实现简单的dropout模块

Dropout是一种常用的正则化方法&#xff0c;用于减少神经网络的过拟合现象。它的基本思想是在训练神经网络的过程中&#xff0c;随机地将一部分神经元的输出值置为0&#xff0c;从而使得神经网络的结构变得不稳定&#xff0c;从而强制网络学习到更加鲁棒的特征表示。 haiku 自…

Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况

Java中使用lamda表达式进行foreach&#xff0c;优雅处理集合List为null的情况 一&#xff1a;举例方法 在使用Java 8及以上版本的Stream API时&#xff0c;如果你想要优雅地处理可能为空的List&#xff0c;可以使用以下方法 1、提前检查 在调用stream之前&#xff0c;先检查…

基于JAVA的社团管理系统的设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 互…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

【ITK库学习】使用itk库进行图像分割(四):水平集分割

目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算&#xff0c;进行水平集分割。在itk中&#xff0c;所…

STM32 ADC采样调试笔记

最近在搞STM32L051系列一个小MCU&#xff0c;要用这个去采集两路ADC作为输入。期间也碰到过一些问题&#xff0c;顺便记录下。 ADC采集原理不说了&#xff0c;主要采集电压&#xff0c;用数字进行细分&#xff0c;这样就可以知道输入电压多少了&#xff0c;网上也有很多相关文…

220v免驱动led驱动芯片:SM2082EDS适用于LED 球泡灯,筒灯

220V免驱动LED驱动芯片是一种电源管理芯片&#xff0c;它可以在接入220V交流电后&#xff0c;将电压转换为适合LED灯珠工作的直流电压&#xff0c;从而点亮LED灯珠。这种驱动芯片通常具有较高的转换效率和稳定性&#xff0c;能够有效地降低能耗和延长LED灯珠的寿命。 SM2082EDS…

【笔记】Helm-2 如何使用-1 chart开发提示和技巧

chart开发提示和技巧 本指南涵盖了Helm chart的开发人员在构建生产环境质量的chart时学到的一些提示和技巧。 了解你的模板功能 Helm使用了 Go模板 将你的自由文件构建成模板。Go塑造了一些内置方法&#xff0c;我们增加了一些其他的。 template package - text/template - …

Vue项目里实现json对象转formData数据

平常调用后端接口传参都是json对象&#xff0c;当提交表单遇到有附件需要传递时&#xff0c;通常是把附件上传单独做个接口&#xff0c;也有遇到后端让提交接口一并把附件传递到后端&#xff0c;这种情况需要把参数转成formData的数据&#xff0c;需要用到new FormData()。json…

【Python】科研代码学习:一

【Python】科研代码学习&#xff1a;一 前言魔方方法 __dict__, __setattr__ , __getattr__ , __getattribute__hasattr(obj, name)super()类型注解解包 unpackingzip() 函数 前言 搞科研&#xff0c;最重要的还是得看懂别人的源代码。 这就意味着python不能太差 看到比较有用…

基于SpringBoot的教学管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…