100359.统计X和Y频数相等的子矩阵数量

1.题目描述

给你一个二维字符矩阵 grid,其中 grid[i][j] 可能是 'X''Y' 或 '.',返回满足以下条件的子矩阵数量:

  • 包含 grid[0][0]
  • 'X' 和 'Y' 的频数相等。
  • 至少包含一个 'X'

示例 1:

输入: grid = [["X","Y","."],["Y",".","."]]

输出: 3

解释:

示例 2:

输入: grid = [["X","X"],["X","Y"]]

输出: 0

解释:

不存在满足 'X' 和 'Y' 频数相等的子矩阵。

2.解题思路

拿到这题首先可以想到使用dp数组存储以每一个点为结束位置的子矩阵中的X,Y个数,可以看出对于下标[i,j],假设i,j均>=1,那么dp[i][j]对应矩阵的X,Y个数是可以通过dp[i-1][j],dp[i][j-1]以及dp[i-1][j-1]这三个子矩阵进行加减操作得到的。

因此,为了表示每个以i,j为结束位置的子矩阵中"X"和“Y”各自的个数,我们定义一个三维dp数组,dp[i][j][0]用于记录"X"的个数,dp[i][j][1]用于记录“Y”的个数,接下来只需要先初始化第0行和第0列这两种特殊情况,然后一般情况就可以通过递推式进行判断

3.代码实现

Java版

class Solution {public int numberOfSubmatrices(char[][] grid) {int m = grid.length, n = grid[0].length;int[][][] dp = new int[m][n][2];if (grid[0][0] == 'X') {dp[0][0][0] += 1;} else if (grid[0][0] == 'Y') {dp[0][0][1] += 1;}int ans = 0;//初始化第0行for (int j = 1; j < n; j++) {int x = dp[0][j-1][0];int y = dp[0][j-1][1];if (grid[0][j] == 'X') {x += 1;} else if (grid[0][j] == 'Y') {y += 1;}dp[0][j][0] = x;dp[0][j][1] = y;if (dp[0][j][0] >= 1 && dp[0][j][0] == dp[0][j][1]) {ans += 1;}}//初始化第0列for (int i = 1; i < m; i++) {int x = dp[i-1][0][0];int y = dp[i-1][0][1];if (grid[i][0] == 'X') {x += 1;} else if (grid[i][0] == 'Y') {y += 1;}dp[i][0][0] = x;dp[i][0][1] = y;if (dp[i][0][0] >= 1 && dp[i][0][0] == dp[i][0][1]) {ans += 1;}}//遍历for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {int x = dp[i-1][j][0] + dp[i][j-1][0] - dp[i-1][j-1][0];int y = dp[i-1][j][1] + dp[i][j-1][1] - dp[i-1][j-1][1];if (grid[i][j] == 'X') {x += 1;} else if (grid[i][j] == 'Y') {y += 1;}dp[i][j][0] = x;dp[i][j][1] = y;if (dp[i][j][0] >= 1 && dp[i][j][0] == dp[i][j][1]) {ans += 1;}}}return ans;}
}

Python版

class Solution:def numberOfSubmatrices(self, grid: List[List[str]]) -> int:m,n = len(grid),len(grid[0])ans = 0dp = [[[0,0] for _ in range(n)] for _ in range(m)]if grid[0][0] == 'X':dp[0][0] = [1,0]elif grid[0][0] == 'Y':dp[0][0] = [0,1]#初始化第0行for j in range(1,n):if grid[0][j] == 'X':dp[0][j] = [dp[0][j-1][0] + 1,dp[0][j-1][1]]elif grid[0][j] == 'Y':dp[0][j] = [dp[0][j-1][0],dp[0][j-1][1] + 1]else:dp[0][j] = dp[0][j-1] if dp[0][j][0] >= 1 and dp[0][j][0] == dp[0][j][1]:ans += 1#初始化第0列for i in range(1,m):if grid[i][0] == 'X':dp[i][0] = [dp[i-1][0][0] + 1,dp[i-1][0][1]]elif grid[i][0] == 'Y':dp[i][0] = [dp[i-1][0][0],dp[i-1][0][1] + 1]else:dp[i][0] = dp[i-1][0]if dp[i][0][0] >= 1 and dp[i][0][0] == dp[i][0][1]:ans += 1for i in range(1,m):for j in range(1,n):x = dp[i-1][j][0] + dp[i][j-1][0] - dp[i-1][j-1][0]y = dp[i-1][j][1] + dp[i][j-1][1] - dp[i-1][j-1][1]if grid[i][j] == 'X':dp[i][j] = [x+1,y]elif grid[i][j] == 'Y':dp[i][j] = [x,y+1]else:dp[i][j] = [x,y]if dp[i][j][0] >= 1 and dp[i][j][0] == dp[i][j][1]:ans += 1return ans

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

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

相关文章

Avalonia中的样式

文章目录 前言样式定义代码切换样式样式主题前言 Avalonia的样式是Styles,与WPF类似。用于在控件之间共享属性设置用于在控件之间共享属性设置,样式由 Selector和属性组成。 样式定义 下面定义一个最简单的样式 <Window.Styles><Style Selector="TextBlock…

双 Token 无感刷新机制实现

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;项目实践 &#x1f96d;本文内容…

微信小程序性能与体验优化

1. 合理的设置可点击元素的响应区域大小&#xff1b; 比较常见的是页面的点击按钮太小&#xff0c;用户点击不到按钮&#xff0c;这样用户体验很不好。 2. 避免渲染页面耗时过长&#xff1b; 当页面渲染时间过长的话&#xff0c;会让用户感觉非常卡顿&#xff0c;当出现这种…

密室逃脱——收集版修改测试

一、原版修改 1、导入资源 Unity Learn | 3D Beginner: Complete Project | URP 2、设置Scene 删除SampleScene&#xff0c;打开UnityTechnologies-3DBeginnerComplete下的MainScene 3、降低音量 (1) 打开Hierarchy面板上的Audio降低音量 (2) 打开Prefabs文件夹&#xf…

lnmp php7 安装ssh2扩展

安装ssh2扩展前必须安装libssh2包 下载地址: wget http://www.libssh2.org/download/libssh2-1.11.0.tar.gzwget http://pecl.php.net/get/ssh2-1.4.tgz &#xff08;这里要换成最新的版本&#xff09; 先安装 libssh2 再安装 SSH2: tar -zxvf libssh2-1.11.0.tar.gzcd libss…

若依框架(RuoYi)中实现部门及子部门用户查询的SQL逻辑解析

前言 在基于若依框架&#xff08;RuoYi&#xff09;的项目开发中&#xff0c;经常会遇到需要根据部门ID查询其下属所有用户的需求&#xff0c;包括直接隶属于该部门的用户以及属于其子部门的所有用户。这一需求在组织架构管理、权限分配等场景中尤为常见。本文将深入解析一段典…

【深入理解计算机系统——2信息的表示和处理】

计算机的本质就是二进制&#xff0c;0/1&#xff0c;称之为bit&#xff08;位&#xff09;&#xff0c;一个位没有什么意义&#xff0c;当同时拥有多个位&#xff0c;并且加上某种解释&#xff0c;就可以表示任何有限集合的元素。&#xff08;为什么是有限&#xff1f;因为用bi…

【日志信息管理】管理日志信息的类

日志用于记录程序的执行记录包括程序的出错记录&#xff0c;程序致命退出原因&#xff0c;程序的正常执行记录。这样我们就可以很快的察觉程序的错误原因、执行状况等等&#xff0c;因此管理日志信息是非常重要的。 日志一般由以下部分组合&#xff1a; 日志时间、日志等级、…

Java 基础--File - IO流(2)

I/O流 定义 数据从硬盘流向内存为输入流&#xff0c;数据从内存流向硬盘为输出流。输入也叫读取数据&#xff0c;输出也叫写出数据。 IO分类 1.按照数据的流向分为&#xff1a;输入流和输出流 ①输入流&#xff1a;把数据从其他设备上读取到内存中的流 ②输出流&#xff1…

Qt 基础组件速学 事件过滤器

学习目标&#xff1a;理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

工控人最爱的PLC触摸屏一体机,有多香

PLC触摸屏一体机是什么 PLC触摸屏一体机&#xff0c;听起来可能有点技术化&#xff0c;但简单来说&#xff0c;它就是一个集成了可编程逻辑控制器&#xff08;PLC&#xff09;和触摸屏的智能设备。这种设备不仅能够执行自动化控制任务&#xff0c;还能实时显示和操作设备状态&a…

JVM原理(十九):JVM虚拟机内存模型

1. 硬件的效率与一致性 数据不安全的原因&#xff1a;缓存一致性的问题 共享内存多核系统&#xff1a;在多路处理器系统中&#xff0c;每个处理器都有自己的高速缓存&#xff0c;而他们又共享同一主内存。 线程先后执行结果不一致问题&#xff1a;除了增加高速缓存之外&#…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK&#xff08;Natural Language Toolkit&#xff09;时&#xff0c…

后端开发常见错误

1、解析json字符串要考虑格式不正确&#xff0c;空值情况 2、解析时间字符串要考虎格式和空值 3、使用mybatis的foreach的时候要考虑拼接sql的耗时&#xff0c;尤其是超过10条数据 4、表字段长度&#xff0c;在接口层校验字段长度&#xff0c; 调用三方系统的报错要截取报错…

CentOS 7安装Elasticsearch7.7.0和Kibana

一. 准备安装包 elasticsearch和kibana&#xff1a;官网历史版本找到并下载&#xff08;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff09;ik分词器&#xff1a;GitHub下载&#xff08;https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨兽:解读评估LLM性能的关键技术指标

衡量巨兽&#xff1a;解读评估LLM性能的关键技术指标 引言一、困惑度&#xff1a;语言模型的试金石1.1 定义与原理1.2 计算公式1.3 应用与意义 二、BLEU 分数&#xff1a;翻译质量的标尺2.1 定义与原理2.2 计算方法2.3 应用与意义 三、其他评估指标&#xff1a;综合考量下的多元…

设计模式之状态机模式

一、状态机模式介绍 状态机模式&#xff08;State Machine Pattern&#xff09;是一种用于描述对象行为的软件设计模式&#xff0c;属于行为型设计模式。在状态机模式中&#xff0c;对象的行为取决于其内部状态&#xff0c;并且在不同的状态下&#xff0c;对象可能会有不同的行…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址&#xff1a; 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下&#xff0c;其实订单服务是api服务&a…

Java 使用sql查询mongodb

在现代应用开发中&#xff0c;关系型数据库和NoSQL数据库各有千秋。MongoDB作为一种流行的NoSQL数据库&#xff0c;以其灵活的文档模型和强大的扩展能力&#xff0c;受到广泛欢迎。然而&#xff0c;有时开发者可能更熟悉SQL查询语法&#xff0c;或者需要在现有系统中复用SQL查询…