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.rhkb.cn/news/373657.html

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

相关文章

《UDS协议从入门到精通》系列——图解0x84:安全数据传输

《UDS协议从入门到精通》系列——图解0x84&#xff1a;安全数据传输 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;均提供专栏内文章链接跳转方式以便快速…

如何利用AI自动生成绘画?5款AI绘画的六大神器!

以下是五款专业级别的AI绘画工具&#xff0c;它们能够帮助用户迅速生成高质量的AI艺术作品&#xff1a; 1.AI先行者&#xff1a; 这是一款流行的 AI 绘画平台&#xff0c;它利用深度学习技术将你的照片或图像转换成艺术风格的绘画作品。你可以在线使用上上传图片并选择喜欢的艺…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

解锁短视频运营新高度:视频号矩阵源码,定时自动发布,畅享高效管理

在数字时代浪潮下&#xff0c;短视频已然成为信息传播的重要渠道。对于内容创作者和企业来说&#xff0c;如何高效地管理和运营短视频账号&#xff0c;实现内容的定时自动发布&#xff0c;成为了一个亟待解决的问题。今天&#xff0c;我们将为您揭秘一款短视频运营的新利器——…

蓝卓创始人褚健:工业软件是数字化转型的灵魂和核心驱动力

如果把“工业3.0”简单理解为就是“自动化”&#xff0c;“工业4.0”理解为是“智能化”&#xff0c;那么“智能化”的实现一定要有软件。如同今天的移动互联网&#xff0c;是因为有大量的APP&#xff0c;所以让人们进入了智能时代。映射到工业、制造业领域&#xff0c;就是要依…

第4章 课程发布:模块需求分析,课程预览(模板引擎 静态页面),课程审核,课程发布(分布式事务,页面静态化:熔断降级),课程搜索(es索引)

1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程&#xff0c;发布课程相当于一个确认操作&#xff0c;课程发布后学习者在网站可以搜索到课程&#xff0c;然后查看课程的详细信息&#xff0c;进一步选课、支付、在线学习。 下边是课程编辑与发布的整体流程&#…

PHP全域旅游景区导览系统源码小程序

&#x1f30d;【探索无界&#xff0c;畅游无忧】全域旅游景区导览系统小程序全攻略 &#x1f4f1;【一键启动&#xff0c;智能导览在手】 告别纸质地图的繁琐&#xff0c;迎接全域旅游景区导览系统小程序的便捷时代&#xff01;只需轻轻一点&#xff0c;手机瞬间变身私人导游…

C++ 编译体系入门指北

前言 之从入坑C之后&#xff0c;项目中的编译构建就经常跟CMake打交道&#xff0c;但对它缺乏系统的了解&#xff0c;遇到问题又陷入盲人摸象。对C的编译体系是如何发展的&#xff0c;为什么要用CMake&#xff0c;它的运作原理是如何的比较感兴趣&#xff0c;所以就想系统学习…

CentOS7 安装 git 命令

通过yum源install下载的git版本比较低&#xff0c;不推荐此方式安装。 官网下载最新版git源码&#xff1a;Git 1. 解压安装包 tar -xzvf git-2.45.2.tar.gz 2. 安装相关依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils…

第三方商城对接重构(HF202407)

文章目录 项目背景一、模块范围二、问题方案1. 商品模块2. 订单模块3. 售后4. 发票5. 结算单 经验总结 项目背景 作为供应商入围第三方商城成功&#xff0c;然后运营了一段时间&#xff0c;第三方通知要重构&#xff0c; 需要重新对接打通接口完成系统对接&#xff0c;能贯穿整…

【QT中实现摄像头播放、以及视频录制】

学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…

Mybatis的优缺点及适用场景?

目录 一、什么是Mybatis&#xff1f; 二、Mybatis框架的特点 三、Mybatis框架的优点&#xff1f; 四、MyBatis 框架的缺点&#xff1f; 五、MyBatis 框架适用场合&#xff1f; 六、代码示例 1. 配置文件 mybatis-config.xml 2. 映射文件 UserMapper.xml 3. Java 代码…

coco_eval 使用

参考 coco eval 解析 COCO目标检测比赛中的模型评价指标介绍&#xff01; coco 的评估函数对应的是 pycocotools 中的 cocoeval.py 文件。 从整体上来看&#xff0c;整个 COCOeval 类的框架如图&#xff1a; 基础的用法为 # The usage for CocoEval is as follows: cocoGt…

深入解析视频美颜SDK:开发直播平台主播专用的美颜工具教学

本篇文章&#xff0c;笔者将深入解析视频美颜SDK的原理与应用&#xff0c;帮助开发者打造适用于直播平台的专业美颜工具。 一、视频美颜SDK的基础原理 视频美颜SDK其核心技术包括人脸检测、面部特征点识别、图像增强和特效应用等。 二、视频美颜SDK的开发流程 环境搭建 首先…

Redis+Caffeine 实现两级缓存

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

人工智能建立在对象存储上的真正原因

tl;dr: 在这篇文章中&#xff0c;我们将探讨 AI 工作负载依赖高性能对象存储的四个技术原因。 1. 对非结构化数据没有限制 在当前的机器学习范式中&#xff0c;性能和能力与计算成比例&#xff0c;计算实际上是数据集大小和模型大小的代理&#xff08;神经语言模型的缩放定律&a…

74HC165芯片验证

目录 0x01 74HC165芯片介绍0x02 编程实现 0x01 74HC165芯片介绍 74HC165的引脚定义如下&#xff0c;长这个样子 ABCDEFGH是它的八个输入引脚&#xff0c;例如你可以将它连接按键&#xff0c;让它来读取8个按键值。也可以将他级联其它的74165&#xff0c;无需增加单片机GPIO引…

Msfvenom制作自己的专属Shell

Msfvenom制作自己的专属Shell 如何通过Msfvenom来生成用户自己的专属Shell?有时候我们上传Shell到目标主机后&#xff0c;不仅我们自己可以连接&#xff0c;其他用户也可以连接&#xff0c;有时候会导致我们丢失该Shell&#xff0c;甚至该shell被用户发现并查杀。 实验环境 …

HTTP 概况

Web的应用层协议是超文本传输协议(HyperTextTransferProtocol&#xff0c;HTTP)&#xff0c;它是 Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中&#xff0c;通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及…

【SVN-CornerStone客户端使用SVN-多人开发-解决冲突 Objective-C语言】

一、接下来,我们来说第三方的图形化界面啊, 1.Corner Stone:图形化界面,使用SVN, Corner Stone的界面,大概就是这样的, 1)左下角:是我们远程的一个仓库, 2)右上角:是我们本地的一些东西, 首先,在我的服务器上,再开一个仓库,叫做wechat, 我在这个里边,新建…