解决leetcode第3548题.等和矩阵分割II
3548.等和矩阵分割II
难度:困难
问题描述:
给你一个由正整数组成的mxn矩阵grid。你的任务是判断是否可以通过一条水平或一条垂直分割线将矩阵分割成两部分,使得:
分割后形成的每个部分都是非空的。
两个部分中所有元素的和相等,或者总共最多移除一个单元格(从其中一个部分中)的情况下可以使它们相等。
如果移除某个单元格,剩余部分必须保持连通。
如果存在这样的分割,返回true;否则,返回false。
注意:如果一个部分中的每个单元格都可以通过向上、向下、向左或向右移动到达同一部分中的其他单元格,则认为这一部分是连通的。
示例1:
输入:grid=[[1,4],[2,3]]
输出:true
解释:
在第0行和第1行之间进行水平分割,结果两部分的元素和为1+4=5和2+3=5,相等。因此答案是true。
示例2:
输入:grid=[[1,2],[3,4]]
输出:true
解释:
在第0列和第1列之间进行垂直分割,结果两部分的元素和为1+3=4和2+4=6。
通过从右侧部分移除2(6-2=4),两部分的元素和相等,并且两部分保持连通。因此答案是true。
示例3:
输入:grid=[[1,2,4],[2,3,5]]
输出:false
解释:
在第0行和第1行之间进行水平分割,结果两部分的元素和为1+2+4=7和2+3+5=10。
通过从底部部分移除3(10-3=7),两部分的元素和相等,但底部部分不再连通(分裂为[2]和[5])。因此答案是false。
示例4:
输入:grid=[[4,1,8],[3,2,6]]
输出:false
解释:
不存在有效的分割,因此答案是false。
提示:
1<=m==grid.length<=105
1<=n==grid[i].length<=105
2<=m*n<=105
1<=grid[i][j]<=105
问题分析:
这个问题的处理,其实就是把一个给定的矩阵按行和列进行拆分,得到拆分出来的两个子矩阵,再把它们的元素和求出来,先比较和值是否相等,如果相等返回True,如果不相等,再找出和值大的那个子矩阵,对它按顺序进行去掉一个元素之后求和的处理,得到一个和值的列表,然后比较较小的那个和值与列表中的哪个值相等,如果有相等的情况,再检查去掉那个元素之后,矩阵是否连通,如果检查是连通的,则返回True,否则继续比较,继续分割子矩阵。如果按行和列进行分割并进行比较都没有相等或相等并连通的情况,最后返回False。
为此设计以下函数实现:
- 函数is_connected(a,i,j),用于检查矩阵a中去掉坐标为(i,j)的元素之后,矩阵是否连通,如果连通,返回True,否则返回False。当行数或列数在大于等2时,不管你去掉哪个元素,列表都是连通的,当只有一行(或列)时,列值(或行值)如果处在中间位置时,列表为不连通状态,处在两端时为连通状态。
- 函数get_sum_array(s),用于计算矩阵s中所有元素之和并返回。
- 函数 get_sum_array_lost_one(a),用于计算矩阵a按顺序去掉各个元素之后,剩余元素之和的列表
- 函数def split_array_row(s,i)和split_array_col(s,i)实现按行数和列数对矩阵s进行分割,并返回分割之后的两个子矩阵。
- 最后的函数split_array_equal_sum(s)则对矩阵s按行和列进行分割处理,计算子矩阵元素和,然后判断和值是否相等或和值小的是否与去掉一个元素之后的某一个和值相等且连通情况进行判断,返回相应的结果。
程序如下:
#判断在一个网格中,除了点(i,j)之外的点是否连通,如果是连通,返回True,否则返回False
def is_connected(a,i,j):n=len(a)m=len(a[0])# print('n,m=',n,m)if n==1 and 0<j<m-1:return Falseelif m==1 and 0<i<n-1:return Falseelse:return True#计算一个矩阵元素之和,并返回
def get_sum_array(s):my_sum=0for i in s:my_sum=my_sum+sum(i)return my_sum#计算一个矩阵元素之和,然后去掉一个元素之后,返回其余元素可能的和的列表
def get_sum_array_lost_one(a):s=get_sum_array(a)n=len(a)m=len(a[0])b=[]for i in range(n):for j in range(m):b.append([s-a[i][j],i,j])return b#按行分割矩阵,i是行数
def split_array_row(s,i):return s[:i],s[i:]#按列分割矩阵,i是列数
def split_array_col(s,i):left=[x[:i] for x in s]right=[x[i:] for x in s]return left,right#对于一个mxn矩阵,判断是否存在一条水平或竖直线,能够将矩阵分割成和相等的两部分
def split_array_equal_sum(s):m=len(s)n=len(s[0])for i in range(1,m):up,down=split_array_row(s,i)u = get_sum_array(up)d = get_sum_array(down)if u==d:return Trueelse:up, down = (up, down) if u > d else (down, up)t=get_sum_array_lost_one(up)down=get_sum_array(down)for i in t:if down==i[0] and is_connected(up,i[1],i[2]):return Trueelse:continuefor j in range(1,n):left,right=split_array_col(s,j)l = get_sum_array(left)r = get_sum_array(right)if l==r:return Trueelse:left, right = (left, right) if l > r else (right, left)t=get_sum_array_lost_one(left)right=get_sum_array(right)for i in t:if right==i[0] and is_connected(left,i[1],i[2]):return Trueelse:continueelse:return False#主程序
grid=eval(input('pls input grid='))
print(split_array_equal_sum(grid))
运行实例一
pls input grid=[[1,2,3]]
True
运行实例二
pls input grid=[[5],[2],[3]]
True
运行实例三
pls input grid=[[1,2,3,4]]
True
运行实例四
pls input grid=[[2,4],[1,5]]
True
运行实例五
pls input grid=[[2,3,4],[4,5,6],[7,8,10]]
False
运行实例六
pls input grid=[[2,3,4],[4,5,6],[7,8,6]]
True
对问题进行切割,准确把握每部分功能,细心实现并组合,问题解决犹如冰雪之消融,心境如天空之朗朗。
相关文章:
解决leetcode第3548题.等和矩阵分割II
3548.等和矩阵分割II 难度:困难 问题描述: 给你一个由正整数组成的mxn矩阵grid。你的任务是判断是否可以通过一条水平或一条垂直分割线将矩阵分割成两部分,使得: 分割后形成的每个部分都是非空的。 两个部分中所有元素的和相…...
深入解析自然语言处理中的语言转换方法
在数字化浪潮席卷全球的今天,自然语言处理(Natural Language Processing,NLP)作为人工智能领域的核心技术之一,正深刻地改变着我们与机器交互的方式。其中,语言转换方法更是 NLP 的关键组成部分,…...
redis 进行缓存实战-18
使用 Redis 进行缓存 Redis 通常被认为只是一个数据存储,但它的速度和内存中特性使其成为缓存的绝佳选择。缓存是一种技术,通过将经常访问的数据存储在快速的临时存储位置来提高应用程序性能。通过使用 Redis 作为缓存,您可以显著减少主数据…...
JFace中MVC的表的单元格编辑功能的实现
一、实现流程 在JFace中实现MVC模式的表格编辑功能通常需要以下步骤: 1、启用编辑模式: 调用TableVierer对象的setCellModifier()方法,设置一个ICellModifier对象,以便在表格中启用编辑模式。实现ICellModifier接口的canModify(…...
在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE
// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称(例如:Sheet1!MyNamedCell)string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…...

canal实现mysql数据同步
目录 1、canal下载 2、mysql同步用户创建和授权 3、canal admin安装和启动 4、canal server安装和启动 5、java 端集成监听canal 同步的mysql数据 6、java tcp同步只是其中一种方式,还可以通过kafka、rabbitmq等方式进行数据同步 1、canal下载 canal实现mysq…...
解决 MySQL 表结构修改中锁定异常的全链路实战指南:从表结构设计到版本调优
引言 在 MySQL 中执行ALTER TABLE修改表结构(如新增字段、调整字段类型)时,锁定异常是最常见的阻碍。无论是 5.7 的 “锁等待超时”、8.0 的 “MDL 锁阻塞”,还是高并发下的 “长事务死锁”,本质都是表结构修改需要获…...
动态规划应用场景 + 代表题目清单(模板加上套路加上题单)
1. 序列型DP(Sequence DP) ✅ 应用场景 单个或多个序列(数组/字符串),求最优子结构。 常见问题:最长递增子序列、最长公共子序列、回文子序列。 🧠 套路总结 单序列:dp[i] max(…...

易境通专线散拼系统:全方位支持多种专线物流业务!
在全球化电商快速发展的今天,跨境电商物流已成为电商运营中极为重要的环节。为了确保物流效率、降低运输成本,越来越多的电商卖家选择专线物流服务。专线物流作为五大主要跨境电商物流模式之一,通过固定的运输路线和流程,极大提高…...
nvm版本管理下pnpm 安装失败问题解决
检查当前使用的 Node.js 是否由 nvm 管理 nvm current 应显示类似 18.16.0 这样的版本号,而不是 system。如果是 system,说明你正在使用系统中其他位置的 Node.js 而不是 nvm 管理的版本。 切换回 nvm 管理的版本 nvm use 18.16.0清除 npm 缓存和全局安装…...
C++高频面试考点 -- 智能指针
C高频面试考点 – 智能指针 C11中引入智能指针的概念,方便堆内存管理。这是因为使用普通指针,容易造成堆内存泄漏,二次释放,程序发生异常时内存泄漏等问题。 智能指针在C11版本之后提供,包含在头文件<memory>中…...

06 如何定义方法,掌握有参无参,有无返回值,调用数组作为参数的方法,方法的重载
1.调用方法 2.掌握有参函数 3.调用数组作为参数 一个例题:数组参数,返回值 方法的重载 两个例题:冒泡排序和九九乘法表的格式学习...

使用vscode MSVC CMake进行C++开发和Debug
使用vscode MSVC CMake进行C开发和Debug 前言软件安装安装插件构建debuug方案一debug方案二其他 前言 一般情况下我都是使用visual studio来进行c开发的,但是由于python用的是vscode,所以二者如果统一的话能稍微提高一点效率。 软件安装 需要安装的软…...
C# AutoMapper对象映射详解
引言 在现代软件开发中,特别是采用分层架构的应用程序,我们经常需要在不同的对象类型之间进行转换。例如,从数据库实体(Entity)转换为数据传输对象(DTO),或者从视图模型(…...
Keil5 MDK LPC1768 RT-Thread KSZ8041NL uIP1.3.1实现UDP网络通讯(服务端接收并发数据)
作为服务端,嵌入式软件实现流程: [上位机A/B/C/...] ↓ UDP [uIP 协议栈接收] ↓ [udp_appcall()] |-> 复制数据 |-> 保存源IP/端口 |-> 推送到接收队列 …...

提升开发运维效率:原力棱镜游戏公司的 Amazon Q Developer CLI 实践
引言 在当今快速发展的云计算环境中,游戏开发者面临着新的挑战和机遇。为了提升开发效率,需要更智能的工具来辅助工作流程。Amazon Q Developer CLI 作为亚马逊云科技推出的生成式 AI 助手,为开发者提供了一种新的方式来与云服务交互。 Ama…...
20250523-BUG-E1696:无法打开元数据文件“platform.winmd(已解决)
BUG:E1696:无法打开元数据文件“platform.winmd(已解决) 最近在用VisualStudio2022打开一个VisualStudio2017的C老项目后报了这个错,几经周折终于解决了,以下是我用的解决方法: 将Debug从Win32改…...
职业规划:动态迭代的系统化路径
1. 底层逻辑:构建职业规划的3大支柱 1.1 价值观锚定 1.1.1 生涯幻游法 通过想象理想生活的场景,包括工作环境、时间分配、人际关系、经济状态等,明确自己内心真正渴望的生活和工作状态,为职业规划提供方向指引。 1.1.2 价值观筛选 使用「价值观筛选卡」从30个常见职业价值…...
redisson-spring-boot-starter 版本选择
以下是更详细的 Spring Boot 与 redisson-spring-boot-starter 版本对应关系,按照 Spring Boot 主版本和子版本细分: 1. Spring Boot 3.x 系列 3.2.x 推荐 Redisson 版本:3.23.1(最新稳定版,兼容 Redis 7.x…...
Docker run -v 的 rw 和 ro 模式_docker ro
一、前言 在使用 Docker 启动容器时,通常需要将宿主机的文件或目录挂载到容器中,以便于管理配置、持久化数据和调试日志。本篇博客将重点介绍 -v/--volume 参数的使用方式、挂载权限(rw 与 ro)的区别,以及如何通过 do…...
CentOS相关操作hub(更新中)
CentOS介绍: CentOS(Community Enterprise Operating System)是基于 Red Hat Enterprise Linux(RHEL)源代码编译的开源企业级操作系统,提供与 RHEL 二进制兼容的功能 完全兼容 RHEL,可直接使用…...

@Column 注解属性详解
提示:文章旨在说明 Column 注解属性如何在日常开发中使用,数据库类型为 MySql,其他类型数据库可能存在偏差,需要注意。 文章目录 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…...

基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联
目录 一、总体架构图 二、设备端(ESP32)低功耗设计(适配 AWS IoT) 1.MQTT 设置(ESP32 连接 AWS IoT Core) 2.低功耗策略总结(ESP32) 三、云端架构(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.数据存…...

unity在urp管线中插入事件
由于在urp下,打包后传统的相机事件有些无法正确执行,这时候我们需要在urp管线中的特定时机进行处理一些事件,需要创建继承ScriptableRenderPass和ScriptableRendererFeature的脚本,示例如下: PluginEventPass…...
前后端的双精度浮点数精度不一致问题解决方案,自定义Spring的消息转换器处理JSON转换
在 Java 中,Long 是一个 64 位的长整型,通常用于表示很大的整数。在后端,Long 类型的数据没有问题,因为 Java 本身使用的是 64 位的整数,可以表示的范围非常大。 但是,在前端 JavaScript 中,Lo…...

docker安装es连接kibana并安装分词器
使用Docker部署Elasticsearch、Kibana并安装分词器有以下主要优点: 1. 快速部署与一致性 一键式部署:通过Docker Compose可以快速搭建完整的ELK栈环境 环境一致性:确保开发、测试和生产环境完全一致,避免"在我机器上能运行…...

线性回归中涉及的数学基础
线性回归中涉及的数学基础 本文详细地说明了线性回归中涉及到的主要的数学基础。 如果数学基础很扎实可以直接空降博文: 线性回归(一)-CSDN博客 一、概率、似然与概率密度函数 1. 概率(Probability) 定义:概率是描述…...

如何计算VLLM本地部署Qwen3-4B的GPU最小配置应该是多少?多人并发访问本地大模型的GPU配置应该怎么分配?
本文一定要阅读我上篇文章!!! 超详细VLLM框架部署qwen3-4B加混合推理探索!!!-CSDN博客 本文是基于上篇文章遗留下的问题进行说明的。 一、本文解决的问题 问题1:我明明只部署了qwen3-4B的模型…...
PostgreSQL日常维护
目录 一:基本使用 1.登录数据库 2.数据库操作 2.1列出库 2.2创建库 2.3删除库 2.4切换库 2.5查看库大小 3.数据表操作 3.1 列出表 3.2创建表 3.3复制表 3.4删除表 4.模式操作命令 4.1创建模式 4.2默认模式 4.3删除模式 4.4查看所有模式 4.5 在指定…...

Attu下载 Mac版与Win版
通过Git地址下载 Mac 版选择对于的架构进行安装 其中遇到了安装不成功,文件损坏等问题 一般是两种情况导致 1.安装版本不对 2.系统权限限制 https://www.cnblogs.com/similar/p/11280162.html打开terminal执行以下命令 sudo spctl --master-disable安装包Git下载地…...