华为OD机试 - 最大矩阵和、最大子矩阵(Java & Python& JS & C++ & C )

本文介绍了华为OD统一考试B卷的最新情况,重点是寻找矩阵中和最大的子矩阵问题。文章提供了输入输出描述、ACM模式注意事项以及不同编程语言的代码实现,并给出了多个测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最新华为OD机试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看

题目描述

输入描述

输出描述

示例1

输入


输出


说明

示例2

输入


输出


示例3

输入


输出


说明

解题思路

<think>好的,用户需要获取用Python实现华为OD外包派遣相关的最大矩阵的代码。首先,我需要回忆一下最大矩阵问题的常见解法。通常,最大子矩阵可以通过动态规划来解决,类似于最大子数组的扩展。 用户之前提到了华为OD机考题目,参考了之前的引用资料,其中提到最大子矩阵是可能的真题之一。因此,我应该提供一个时间复杂度较低的解决方案,可能在O(n^3)级别,适合处理中等规模的输入。 接下来,我需要确保代码的正确性。最大子矩阵的核心思想是将二维问题转化为一维,利用列的前缀,然后对每一对行之间的列进行压缩,转化为一维数组,再应用最大子数组的Kadane算法。 另外,用户可能需要代码中有注释解释关键步骤,以便理解实现原理。同时,输入输出的示例也很重要,帮助用户测代码是否正确。 需要检查边界条件,例如矩阵全为负数的情况,此时最大应该是最大的那个元素。此外,代码需要处理不同的矩阵尺寸,包括行数大于列数的情况,可能需要转置矩阵来优化性能。 最后,根据用户之前的问题,可能需要生成相关问题,比如时间复杂度的分析、优化方法或应用场景。这些相关问题应该与最大子矩阵相关,并且帮助用户深入理解问题。</think>### 最大子矩阵 Python实现 #### 问题描述 给定一个二维整数矩阵,找出其子矩阵的元素最大值。 #### 核心算法思路 采用**压缩维度+Kadane算法**的组合策略: 1. **列前缀预处理**:计算每列的前缀数组 2. **行区间遍历**:遍历所有可能的行组合(从第i行到第j行) 3. **列压缩计算**:将行区间内的列压缩为一维数组 4. **Kadane算法**:在压缩后的一维数组中寻找最大子数组 时间复杂度:$O(n^3)$(当矩阵为$n \times n$时) #### 代码实现 ```python def max_submatrix_sum(matrix): if not matrix: return 0 rows = len(matrix) cols = len(matrix[0]) max_sum = -float('inf') # 列前缀预处理 col_prefix = [[0] * cols for _ in range(rows + 1)] for i in range(rows): for j in range(cols): col_prefix[i+1][j] = col_prefix[i][j] + matrix[i][j] # 遍历所有可能的行区间 for top in range(rows): for bottom in range(top, rows): # 压缩当前行区间到一维数组 compressed = [ col_prefix[bottom+1][j] - col_prefix[top][j] for j in range(cols) ] # Kadane算法求最大子数组 current_sum = 0 for num in compressed: current_sum = max(num, current_sum + num) max_sum = max(max_sum, current_sum) return max_sum if max_sum != -float('inf') else 0 # 测样例 matrix = [ [1, 2, -1, -4, -20], [-8, -3, 4, 2, 1], [3, 8, 10, 1, 3], [-4, -1, 1, 7, -6] ] print(max_submatrix_sum(matrix)) # 输出29(对应子矩阵第三行) ``` #### 算法流程解析 1. **前缀预处理**:通过`col_prefix`数组记录每列从顶部到当前行的累加,时间复杂度$O(n^2)$ $$ \text{col\_prefix}[i][j] = \sum_{k=0}^{i-1} \text{matrix}[k][j] $$ 2. **行区间遍历**:双重循环遍历所有可能的上下边界组合,时间复杂度$O(n^2)$ 3. **列压缩计算**:利用前缀数组快速计算任意行区间内的列,时间复杂度$O(n)$ $$ \text{compressed}[j] = \text{col\_prefix}[bottom+1][j] - \text{col\_prefix}[top][j] $$ 4. **Kadane算法**:在压缩后的一维数组中寻找最大子数组,时间复杂度$O(n)$ #### 性能优化技巧 - **矩阵转置优化**:当列数远大于行数时,可转置矩阵后按行处理 - **提前终止条件**:记录当前最大子矩阵的位置信息,遇到全正数矩阵可直接返回 - **空间优化**:可将二维前缀数组优化为一维滚动数组 #### 输入输出示例 输入矩阵: ``` [ [1, 2, -1, -4, -20], [-8, -3, 4, 2, 1], [3, 8, 10, 1, 3], [-4, -1, 1, 7, -6] ] ``` 最大子矩阵对应区域: ``` 第三行全部元素: 3+8+10+1+3 = 25 第三行前三列: 3+8+10 = 21 ``` 实际最大为29(包含第二行部分元素)[^1] #### 相关真题扩展 该算法可解决以下变形问题: 1. 最大全1子矩阵(将0/1矩阵转化为高度直方图) 2. 最大矩形覆盖问题(需记录坐标范围) 3. 带权重的最大子矩阵(加入权重系数计算)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值