网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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完整代码如下:

package main

import (
"fmt"
"math"
"slices"
)

func maxSubArray(nums []int) int {
ans := math.MinInt // 注意答案可以是负数,不能初始化成 0
f := nums[0]
for _, x := range nums[1:] {
ans = max(ans, f+x) // f+x 保证子数组至少有两个数
f = max(f, 0) + x
}
return ans
}

func maxScore(grid [][]int) int {
m, n := len(grid), len(grid[0])
ans := math.MinInt

// 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上
if m > 2 && n > 2 {
for _, row := range grid[1 : m-1] {
ans = max(ans, slices.Max(row[1:n-1]))
}
}

// 每行的最大子数组和(子数组长度 >= 2)
for _, row := range grid {
ans = max(ans, maxSubArray(row))
}

// 每列的最大子数组和(子数组长度 >= 2)
col := make([]int, m)
for j := range n {
for i, row := range grid {
col[i] = row[j]
}
ans = max(ans, maxSubArray(col))
}

return ans
}

func main() {
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-*-

import math
from typing import List

def max_sub_array(nums: List[int]) -> int:
# 注意答案可以是负数,不能初始化成 0
ans = -math.inf
f = nums[0]
for x in nums[1:]:
# f+x 保证子数组至少有两个数
ans = max(ans, f + x)
f = max(f, 0) + x
return ans

def max_score(grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
ans = -math.inf

# 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上
if m > 2 and n > 2:
for row in grid[1:m-1]:
# 注意切片是左闭右开,row[1:n-1] 会排除第一列和最后一列
if row[1:n-1]:
ans = max(ans, max(row[1:n-1]))

# 每行的最大子数组和(子数组长度 >= 2)
for row in grid:
ans = max(ans, max_sub_array(row))

# 每列的最大子数组和(子数组长度 >= 2)
for j in range(n):
col = [grid[i][j] for i in range(m)]
ans = max(ans, max_sub_array(col))

return ans

if __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++完整代码如下:

  




using namespace std;

int maxSubArray(const vector& nums) {
// 注意答案可以是负数,不能初始化成 0
int ans = INT_MIN;
int f = nums[0];
for (size_t i = 1; i < nums.size(); i++) {
int x = nums[i];
// f+x 保证子数组至少有两个数
ans = max(ans, f + x);
f = max(f, 0) + x;
}
return ans;
}

int maxScore(const vector int >>& grid) {
int m = grid.size();
int n = grid[ 0 ].size();
int ans = INT_MIN;

// 单独计算子数组长为 1 的情况,此时子数组不能在 grid 的边界上
if (m > 2 && n > 2 ) {
for ( int i = 1 ; i < m - 1 ; i++) {
// 找到 row[1:n-1] 中的最大值
int maxVal = INT_MIN;
for ( int j = 1 ; j < n - 1 ; j++) {
maxVal = max(maxVal, grid[i][j]);
}
ans = max(ans, maxVal);
}
}

// 每行的最大子数组和(子数组长度 >= 2)
for ( const auto& row : grid) {
ans = max(ans, maxSubArray(row));
}

// 每列的最大子数组和(子数组长度 >= 2)
vector< int > col(m);
for ( int j = 0 ; j < n; j++) {
for ( int i = 0 ; i < m; i++) {
col[i] = grid[i][j];
}
ans = max(ans, maxSubArray(col));
}

return ans;
}

int main() {
vector int >> grid = {
{ 1 , 2 , 0 , -3 },
{ 1 , -2 , 1 , 0 },
{ -4 , 2 , -1 , 3 },
{ 3 , -3 , 3 , -2 },
{ -1 , -5 , 0 , 1 }
};
int result = maxScore(grid);
cout << result << endl;
return 0 ;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
用嘴舔勺子、穿衣暴露在人前晃,没分寸感的她来《中餐厅》干嘛?

用嘴舔勺子、穿衣暴露在人前晃,没分寸感的她来《中餐厅》干嘛?

轩逸阿II
2026-08-24 09:48:01
巴专家讨论引进歼16D,印媒反驳:异想天开,它比歼20更具威胁

巴专家讨论引进歼16D,印媒反驳:异想天开,它比歼20更具威胁

巅峰高地
2026-08-29 20:45:49
直到今天美国人才猛然发现,当年冻结俄罗斯3000亿外汇,竟成了本世纪最臭的一步棋!不仅没逼垮卢布,反帮普京拔除了国内最大毒瘤

直到今天美国人才猛然发现,当年冻结俄罗斯3000亿外汇,竟成了本世纪最臭的一步棋!不仅没逼垮卢布,反帮普京拔除了国内最大毒瘤

回京历史梦
2026-08-26 18:00:02
广东省广州市公安局

广东省广州市公安局

苗苗情感说
2026-08-31 03:56:35
烟草系统拉响警报:再这样下去,中国烟草真要出大问题

烟草系统拉响警报:再这样下去,中国烟草真要出大问题

阿振观点
2026-08-25 05:56:32
事业没了、婚也离了,被封5年后赵薇再曝近况,瘦到脱相不敢认

事业没了、婚也离了,被封5年后赵薇再曝近况,瘦到脱相不敢认

观史搜寻着
2026-08-28 20:26:27
中国永远无法原谅的5个国家,日本只排在第二位,真正排在第一的名字,很多人第一次听到都会愣住

中国永远无法原谅的5个国家,日本只排在第二位,真正排在第一的名字,很多人第一次听到都会愣住

纪史行者
2026-08-30 00:25:03
切尔西球迷懵了:这哥们还在我们队里?300万镑,拜拜了您嘞

切尔西球迷懵了:这哥们还在我们队里?300万镑,拜拜了您嘞

暗香暗香
2026-08-29 01:57:51
随着大连鲲城3-2,梅州客家1-1,广州豹3-0,中甲最新积分榜出炉

随着大连鲲城3-2,梅州客家1-1,广州豹3-0,中甲最新积分榜出炉

侧身凌空斩
2026-08-30 21:24:40
菲律宾连胜约旦和伊朗 索托13+16再砍两双

菲律宾连胜约旦和伊朗 索托13+16再砍两双

体坛周报
2026-08-30 22:05:39
除了性生活,就是打麻将!2000多县城普通人的生活现状只能这样?

除了性生活,就是打麻将!2000多县城普通人的生活现状只能这样?

流史岁月
2026-07-06 18:00:06
作家列夫·托尔斯泰四世孙的罪恶言论:公然宣称彻底炸毁乌克兰

作家列夫·托尔斯泰四世孙的罪恶言论:公然宣称彻底炸毁乌克兰

巴雷文化
2026-08-30 05:02:19
特写式穿搭,呈现一种忧郁的光亮

特写式穿搭,呈现一种忧郁的光亮

飛尚日记
2026-08-20 08:18:53
大多数男人到了五十岁,才可能真正迎来人生的巅峰

大多数男人到了五十岁,才可能真正迎来人生的巅峰

加油丁小文
2026-08-30 06:30:10
难以置信!考上大学入学仅10天,女孩执意退学,只因宿舍没有独立洗澡间

难以置信!考上大学入学仅10天,女孩执意退学,只因宿舍没有独立洗澡间

火山詩话
2026-08-28 06:45:16
如果两岸突然爆发战争,那么,我们首先斩首的就应该是顾立雄

如果两岸突然爆发战争,那么,我们首先斩首的就应该是顾立雄

牛牛叨史
2025-06-16 18:39:18
毛主席宴请陈嘉庚,菜刚上就满脸歉意:我薪水有限,实在买不起肉

毛主席宴请陈嘉庚,菜刚上就满脸歉意:我薪水有限,实在买不起肉

健康快乐丁
2025-05-29 19:14:45
都说越南人生活慢,但这位日本小哥为了追爱,把跨国航班飞出了“国内地铁”的节奏

都说越南人生活慢,但这位日本小哥为了追爱,把跨国航班飞出了“国内地铁”的节奏

缅甸中文网
2026-08-29 13:12:20
俄罗斯近期改口,把侵略战争竭力描绘成卫国战争

俄罗斯近期改口,把侵略战争竭力描绘成卫国战争

李未熟擒话2
2026-08-29 16:29:39
强迫几十名老师与“耻辱”合影,是谁给了雷波县教育部门的权力?

强迫几十名老师与“耻辱”合影,是谁给了雷波县教育部门的权力?

李万卿
2026-08-29 13:45:14
2026-08-31 08:59:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1426文章数 80关注度
往期回顾 全部

科技要闻

OpenClaw:红过,爱过,散了

头条要闻

牛弹琴:一觉醒来美伊又打起来 鲁比奥又被自己人打脸

头条要闻

牛弹琴:一觉醒来美伊又打起来 鲁比奥又被自己人打脸

体育要闻

库明加和狼,突破天花板差的那一点距离

娱乐要闻

梅艳芳母亲覃美金离世,享年102岁

财经要闻

纪念币骗局触碰法律红线!专坑老人!

汽车要闻

巨幕长联屏/天神之眼/云辇-C 方程豹钛9将于四季度上市

态度原创

游戏
亲子
教育
艺术
军事航空

传下一代Xbox 100%实体版 索尼被迫修改纯数字计划

亲子要闻

智力小动画:忘记了什么?

教育要闻

山东大学2026新生大数据出炉:34名新生叫浩然,济南历城二中登顶省内生源中学排行榜榜首

艺术要闻

他是南宋最冤画家:国内无人问津,却养活日本千年美学

军事要闻

金正恩主持会议 朝鲜最高军事领导层现重大调整

无障碍浏览 进入关怀版