解决leetcode第3548题.等和矩阵分割II

news2025/5/25 0:48:12

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。

为此设计以下函数实现:

  1. 函数is_connected(a,i,j),用于检查矩阵a中去掉坐标为(i,j)的元素之后,矩阵是否连通,如果连通,返回True,否则返回False。当行数或列数在大于等2时,不管你去掉哪个元素,列表都是连通的,当只有一行(或列)时,列值(或行值)如果处在中间位置时,列表为不连通状态,处在两端时为连通状态。
  2. 函数get_sum_array(s),用于计算矩阵s中所有元素之和并返回。
  3. 函数 get_sum_array_lost_one(a),用于计算矩阵a按顺序去掉各个元素之后,剩余元素之和的列表
  4. 函数def split_array_row(s,i)和split_array_col(s,i)实现按行数和列数对矩阵s进行分割,并返回分割之后的两个子矩阵。
  5. 最后的函数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 False
    elif m==1 and 0<i<n-1:
        return False
    else:
        return True

#计算一个矩阵元素之和,并返回
def get_sum_array(s):
    my_sum=0
    for 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 True
        else:
            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 True
                else:
                    continue
    for 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 True
        else:
            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 True
                else:
                    continue
    else:
        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

对问题进行切割,准确把握每部分功能,细心实现并组合,问题解决犹如冰雪之消融,心境如天空之朗朗。

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

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

相关文章

canal实现mysql数据同步

目录 1、canal下载 2、mysql同步用户创建和授权 3、canal admin安装和启动 4、canal server安装和启动 5、java 端集成监听canal 同步的mysql数据 6、java tcp同步只是其中一种方式&#xff0c;还可以通过kafka、rabbitmq等方式进行数据同步 1、canal下载 canal实现mysq…

易境通专线散拼系统:全方位支持多种专线物流业务!

在全球化电商快速发展的今天&#xff0c;跨境电商物流已成为电商运营中极为重要的环节。为了确保物流效率、降低运输成本&#xff0c;越来越多的电商卖家选择专线物流服务。专线物流作为五大主要跨境电商物流模式之一&#xff0c;通过固定的运输路线和流程&#xff0c;极大提高…

06 如何定义方法,掌握有参无参,有无返回值,调用数组作为参数的方法,方法的重载

1.调用方法 2.掌握有参函数 3.调用数组作为参数 一个例题&#xff1a;数组参数&#xff0c;返回值 方法的重载 两个例题&#xff1a;冒泡排序和九九乘法表的格式学习

使用vscode MSVC CMake进行C++开发和Debug

使用vscode MSVC CMake进行C开发和Debug 前言软件安装安装插件构建debuug方案一debug方案二其他 前言 一般情况下我都是使用visual studio来进行c开发的&#xff0c;但是由于python用的是vscode&#xff0c;所以二者如果统一的话能稍微提高一点效率。 软件安装 需要安装的软…

提升开发运维效率:原力棱镜游戏公司的 Amazon Q Developer CLI 实践

引言 在当今快速发展的云计算环境中&#xff0c;游戏开发者面临着新的挑战和机遇。为了提升开发效率&#xff0c;需要更智能的工具来辅助工作流程。Amazon Q Developer CLI 作为亚马逊云科技推出的生成式 AI 助手&#xff0c;为开发者提供了一种新的方式来与云服务交互。 Ama…

@Column 注解属性详解

提示&#xff1a;文章旨在说明 Column 注解属性如何在日常开发中使用&#xff0c;数据库类型为 MySql&#xff0c;其他类型数据库可能存在偏差&#xff0c;需要注意。 文章目录 一、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下&#xff0c;打包后传统的相机事件有些无法正确执行&#xff0c;这时候我们需要在urp管线中的特定时机进行处理一些事件&#xff0c;需要创建继承ScriptableRenderPass和ScriptableRendererFeature的脚本&#xff0c;示例如下&#xff1a; PluginEventPass&#xf…

docker安装es连接kibana并安装分词器

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

线性回归中涉及的数学基础

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

如何计算VLLM本地部署Qwen3-4B的GPU最小配置应该是多少?多人并发访问本地大模型的GPU配置应该怎么分配?

本文一定要阅读我上篇文章&#xff01;&#xff01;&#xff01; 超详细VLLM框架部署qwen3-4B加混合推理探索&#xff01;&#xff01;&#xff01;-CSDN博客 本文是基于上篇文章遗留下的问题进行说明的。 一、本文解决的问题 问题1&#xff1a;我明明只部署了qwen3-4B的模型…

Attu下载 Mac版与Win版

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

V2X协议|如何做到“车联万物”?【无线通信小百科】

1、什么是V2X V2X&#xff08;Vehicle-to-Everything&#xff09;即“车联万物”&#xff0c;是一项使车辆能够与周围环境实现实时通信的前沿技术。它允许车辆与其他交通参与者和基础设施进行信息交互。通过V2X&#xff0c;车辆不仅具备“远程感知”能力&#xff0c;还能在更大…

[测试_3] 生命周期 | Bug级别 | 测试流程 | 思考

目录 一、软件测试的生命周期&#xff08;重点&#xff09; 1、软件测试 & 软件开发生命周期 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;测试计划 &#xff08;3&#xff09;测试设计与开发 &#xff08;4&#xff09;测试执行 &#xff08;5&am…

RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性

幂等性保障 幂等性&#xff08;Idempotency&#xff09; 是计算机科学和网络通信中的一个重要概念&#xff0c;指的是某个操作无论被执行多少次&#xff0c;所产生的效果与执行一次的效果相同。 应用程序的幂等性&#xff1a; 在应用程序中&#xff0c;幂等性就是指对一个系统…

java基础知识回顾1(可用于Java基础速通)考前,面试前均可用!

目录 一、初识java 二、基础语法 1.字面量 2.变量 3.关键字 4.标识符 声明&#xff1a;本文章根据黑马程序员b站教学视频做的笔记&#xff0c;可对应课程听&#xff0c;课程链接如下: 02、Java入门&#xff1a;初识Java_哔哩哔哩_bilibili 一、初识java Java是美国 sun 公…

云原生CICD-Tekton入门到精通

文章目录 一、Tekton介绍二、Tekton组件介绍三、执行流程四、安装Tekton管道五、安装Tekton Dashboard六、安装Tekton Cli七、运行单Task八、运行流水线九、在流水线中使用secret十、taskSpec、taskRef、pipelineRef、pipelineSpec使用pipelineRef与taskRef结合使用(推荐)pipel…

opencv 图像的平移和旋转

warpAffine函数讲解,图片可自行下载&#xff0c;也可用自己的图片 原图im 平移im_shifted 旋转im_rotated # 图像仿射变换 # 步骤&#xff1a; 读取图像 -> 创建仿射变换矩阵 -> 仿射变换计算 # 平移变换矩阵&#xff1a;一种写法&#xff0c;直接写死 # 旋转变…

IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS

目录 Windows的准备 1. 将与Linux上版本相同的hadoop压缩包解压到本地 ​编辑2.设置$HADOOP HOME环境变量指向:E:\hadoop-3.3.4 3.下载hadoop.dll和winutils.exe文件 4.将hadoop.dll和winutils.exe放入$HADOOP HOME/bin中 IDEA中操作 1.下载Big Data Tools插件 2.添加并连…

hysAnalyser特色的TS流编辑、剪辑和转存MP4功能说明

摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具&#xff0c;融合了常规TS文件的剪辑&#xff0c;转存功能&#xff0c;可用于平常的视频开发和测试。 本文详细阐述了对MPEG-TS 流的节目ID&#xff0c;名称&#xff0c;PID&#xff0c;时间戳&#xff0c;流类型&#xff…