当前位置: 首页 > news >正文

2026-08-30:矩阵中最大共享路径和。用go语言,有一个 m 行 n 列的整数矩阵。 第一个玩家从矩阵的左上角出发,只能向右或向下走,最终要走到右下角。 第二个玩家从左下角出发,只能向右或向上走

2026-08-30:矩阵中最大共享路径和。用go语言,有一个 m 行 n 列的整数矩阵。

第一个玩家从矩阵的左上角出发,只能向右或向下走,最终要走到右下角。

第二个玩家从左下角出发,只能向右或向上走,最终要走到右上角。

每个玩家各自选一条符合自己移动规则的完整路线。

如果某个格子同时被这两个玩家选中的路线经过,就称它为“共享格子”。

现在请你计算:在所有可能的路线组合中,所有共享格子上的数值之和,最大可以达到多少。

最后返回这个最大总和值。

m == grid.length。

n == grid[i].length。

2 <= m, n <= 1000。

4 <= m * n <= 500000。

-100 <= grid[i][j] <= 100。

输入: grid = [[1,2,0,-3],[1,-2,1,0],[-4,2,-1,3],[3,-3,3,-2],[-1,-5,0,1]]。

输出: 4。

解释:

图中展示了一种最优路径选择。

玩家 1 沿着从左上角到右下角的红色/紫色路径移动:

(0, 0) → (1, 0) → (2, 0) → (2, 1) → (2, 2) → (2, 3) → (3, 3) → (4, 3)

玩家 2 沿着从左下角到右上角的蓝色/紫色路径移动:

(4, 0) → (4, 1) → (3, 1) → (2, 1) → (2, 2) → (2, 3) → (1, 3) → (0, 3)

共享单元格为 (2, 1) 、(2, 2) 和 (2, 3) 。

总和为 2 + (-1) + 3 = 4 ,这是可能的最大总和。

题目来自力扣3938。

一、题目核心理解

  • 两个玩家路径形状不同:
    • 玩家1:左上 → 右下,只能右/下
    • 玩家2:左下 → 右上,只能右/上
  • 两条路径共享的格子,它们的值会被加总。
  • 我们要找所有可能路径组合中,共享格子值之和的最大值

二、算法整体思路(根据代码推导)

代码并没有直接模拟两条路径,而是将问题转化为“寻找矩阵中某个方向上的最大子数组和”,这一点需要先说明:

关键观察(隐含的数学性质)

对于这种“一个从左上到右下,一个从左下到右上”的路径,它们共享的格子一定形成一条连续的水平或垂直段(因为移动方向限制)。
具体地,在这个 4 方向限制下,两条路径的交集要么是一条水平连续段,要么是一条垂直连续段(也可能只是一个点,但单点可视为长度为1的段)。

因此:

  • 如果共享段是水平的,那么它就是某一行中连续的一段。
  • 如果共享段是垂直的,那么它就是某一列中连续的一段。

于是问题变成:

在矩阵中,找出所有可能作为共享段的水平连续段垂直连续段,计算它们的和,取最大值。


三、代码对应步骤分解

1. 定义辅助函数maxSubArray(nums)
  • 功能:计算一个数组中长度至少为 2的连续子数组的最大和。
  • 实现方式:
    • 用动态规划,f表示以当前元素结尾的最大子数组和(允许长度为1)
    • 但是,为了强制长度 ≥ 2,它每次用f + x来更新答案,这保证至少有两个数。
    • 再更新f = max(f, 0) + x,相当于允许从当前元素重新开始(但用于后续组合)。
2. 主函数maxScore(grid)处理过程

步骤 2.1 – 初始化

  • 获取行数m、列数n
  • 答案ans初始为极小值(负无穷)。

步骤 2.2 – 处理长度为 1 的共享段(单格子)

  • 条件:m > 2 && n > 2,即矩阵内部有非边界格子。
  • 遍历所有不在最外圈的格子(行 1 到 m-2,列 1 到 n-2)。
  • 对于这些格子,单独取它的值(作为长度为1的共享段),更新ans
  • 为什么只取内部?因为边界格子不可能成为两条路径的唯一共享点(路径起始或终点本身虽可共享,但题目隐含最大和不会只取边界单点,且代码特意排除)。

步骤 2.3 – 处理水平共享段(长度 ≥ 2)

  • 遍历每一行。
  • 对每一行,调用maxSubArray计算该行中长度 ≥ 2 的最大连续子数组和。
  • 更新ans

步骤 2.4 – 处理垂直共享段(长度 ≥ 2)

  • 对每一列:
    • 提取该列所有元素,组成一个长度为m的临时数组col
    • 对该数组调用maxSubArray,得到该列中长度 ≥ 2 的最大连续子数组和。
    • 更新ans

步骤 2.5 – 返回答案

  • 返回最终ans

四、关于为什么这样能覆盖所有情况(简要解释)

  • 两条路径的交集,由于移动方向限制,确实只会是一条水平或垂直的连续段
  • 段的长度可以是 1 或多个格子。
  • 代码分别覆盖了:
    • 长度为1(仅内部格子)
    • 长度≥2(按行或按列求最大子数组和)
  • 因此,它能找到所有可能的共享段的最大和。

五、时间复杂度和空间复杂度

时间复杂度
  • 行扫描:对每一行调用maxSubArray,每行长度 n,共 m 行 →O(m·n)
  • 列扫描:对每一列,构造长度为 m 的数组,共 n 列 →O(n·m)
  • 单格子扫描:最多 (m-2)·(n-2) 个 → 也是O(m·n)
  • 总体:O(m·n)
额外空间复杂度
  • 仅用了一个长度为m的临时数组col用于提取列。
  • 其余为常数变量。
  • 因此额外空间为O(m)(因为列长度最大为 m)。

六、总结

  • 算法本质:将二维路径共享问题,降维成一维最大子数组问题
  • 分三类情况处理共享段:单点、水平段、垂直段。
  • 时间复杂度O(m·n),空间复杂度O(m)(或 O(min(m,n)),这里取 O(m))。

如果你还想进一步了解为什么两条路径的交集一定只是水平或垂直连续段,我可以画图或给出更直观的证明。

Go完整代码如下:

packagemainimport("fmt""math""slices")funcmaxSubArray(nums[]int)int{ans:=math.MinInt// 注意答案可以是负数,不能初始化成 0f:=nums[0]for_,x:=rangenums[1:]{ans=max(ans,f+x)// f+x 保证子数组至少有两个数f=max(f,0)+x}returnans}funcmaxScore(grid[][]int)int{m,n:=len(grid),len(grid[0])ans:=math.MinInt// 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上ifm>2&&n>2{for_,row:=rangegrid[1:m-1]{ans=max(ans,slices.Max(row[1:n-1]))}}// 每行的最大子数组和(子数组长度 >= 2)for_,row:=rangegrid{ans=max(ans,maxSubArray(row))}// 每列的最大子数组和(子数组长度 >= 2)col:=make([]int,m)forj:=rangen{fori,row:=rangegrid{col[i]=row[j]}ans=max(ans,maxSubArray(col))}returnans}funcmain(){grid:=[][]int{{1,2,0,-3},{1,-2,1,0},{-4,2,-1,3},{3,-3,3,-2},{-1,-5,0,1}}result:=maxScore(grid)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-importmathfromtypingimportListdefmax_sub_array(nums:List[int])->int:# 注意答案可以是负数,不能初始化成 0ans=-math.inf f=nums[0]forxinnums[1:]:# f+x 保证子数组至少有两个数ans=max(ans,f+x)f=max(f,0)+xreturnansdefmax_score(grid:List[List[int]])->int:m,n=len(grid),len(grid[0])ans=-math.inf# 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上ifm>2andn>2:forrowingrid[1:m-1]:# 注意切片是左闭右开,row[1:n-1] 会排除第一列和最后一列ifrow[1:n-1]:ans=max(ans,max(row[1:n-1]))# 每行的最大子数组和(子数组长度 >= 2)forrowingrid:ans=max(ans,max_sub_array(row))# 每列的最大子数组和(子数组长度 >= 2)forjinrange(n):col=[grid[i][j]foriinrange(m)]ans=max(ans,max_sub_array(col))returnansif__name__=="__main__":grid=[[1,2,0,-3],[1,-2,1,0],[-4,2,-1,3],[3,-3,3,-2],[-1,-5,0,1]]result=max_score(grid)print(result)

C++完整代码如下:

#include<iostream>#include<vector>#include<algorithm>#include<climits>usingnamespacestd;intmaxSubArray(constvector<int>&nums){// 注意答案可以是负数,不能初始化成 0intans=INT_MIN;intf=nums[0];for(size_t i=1;i<nums.size();i++){intx=nums[i];// f+x 保证子数组至少有两个数ans=max(ans,f+x);f=max(f,0)+x;}returnans;}intmaxScore(constvector<vector<int>>&grid){intm=grid.size();intn=grid[0].size();intans=INT_MIN;// 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上if(m>2&&n>2){for(inti=1;i<m-1;i++){// 找到 row[1:n-1] 中的最大值intmaxVal=INT_MIN;for(intj=1;j<n-1;j++){maxVal=max(maxVal,grid[i][j]);}ans=max(ans,maxVal);}}// 每行的最大子数组和(子数组长度 >= 2)for(constauto&row:grid){ans=max(ans,maxSubArray(row));}// 每列的最大子数组和(子数组长度 >= 2)vector<int>col(m);for(intj=0;j<n;j++){for(inti=0;i<m;i++){col[i]=grid[i][j];}ans=max(ans,maxSubArray(col));}returnans;}intmain(){vector<vector<int>>grid={{1,2,0,-3},{1,-2,1,0},{-4,2,-1,3},{3,-3,3,-2},{-1,-5,0,1}};intresult=maxScore(grid);cout<<result<<endl;return0;}

http://www.cnnetsun.cn/news/4320637.html

相关文章:

  • 后端技术面试全流程复盘:从项目深挖到系统设计实战
  • 李宏毅2021机器学习深度学习课程:从笔记到实战的完整刷课指南
  • 车辆横向控制中的MPC联合仿真:从CarSim到Simulink的完整实践
  • 脑机单词速记为什么不是“买两台学习舱就能开课”?
  • 农业病虫害知识图谱构建实战:从爬虫到Neo4j可视化
  • 公交POV拍摄全流程:从设备固定到站点标记,记录城市交通运行秩序
  • Python数据分析实战:技术社区周度运营数据可视化与洞察
  • 多种滚动轴承诊断数据集(凯斯西储大学、辛辛那提大学、西安交通大学)故障诊断系统,一维时间序列分类和二维图像处理分类,采用多种模型进行对比实验
  • B站技术岗笔试复盘:前端、运维、后端与移动端核心考点解析
  • 《妃梦千年》第38章-归途之择
  • C 语言学习笔记(六)
  • 福瑞兽剧预告片制作全流程解析:从兽设建模到渲染合成
  • 【计算机毕业设计】基于深度学习的智能交通流量预测 Web 系统
  • 《易学・姤䷫|道影子新解 044》
  • 游戏NPC接入大语言模型为何难?从确定性、实时性到成本解析
  • QCA7000/7005 SPI驱动开发指南:MCU与电力线通信芯片的通信实现
  • GFS-VL:融合3D VLM稠密知识与少样本校准的点云分割
  • AI蜂群逃逸与多智能体系统安全:沙箱防护实践指南
  • 从单片机到ROS2:机器人嵌入式物联网自学路线全攻略
  • 从零训练二次元角色LoRA:Stable Diffusion角色一致性实战全流程
  • 八电HOLOLIVE vs 八门P5X:WS练习局触发轴与资源节奏拆解
  • Hypermesh 2024前处理实战:网格划分、质量检查与节点显示问题
  • ESP8266 与 ESP-01S 到底是什么?从 Wi-Fi SoC 到串口联网模块,新手一篇快速看懂
  • Luckysheet集成实践:从zip解压到Excel转JSON的全流程指南
  • LVGL 9.0移植到STM32F746G-DISCO与性能基准测试实战
  • 用 Scrapy 爬取百家姓与姓氏源流数据:多源采集、数据清洗与结构化存储实战
  • 直播录像处理实战:FFmpeg转码切片与批量归档全流程
  • 266美元+四个AI模型,一天打造AI小镇应用:开源项目实战
  • 阿里编程题4星刷题体验:从算法建模到树状数组的实战解析
  • 【设计模式精讲】5.工厂方法(Factory Method)