LeetCode 3643. 垂直翻转子矩阵 | Python双解法逐行精讲题目难度简单 |核心考点矩阵操作、子矩阵边界计算、原地交换优化 |适用人群算法新手、Python初学者、LeetCode刷题选手一、题目描述给定一个m x n的整数矩阵grid以及三个整数x、y和k完成指定子矩阵的垂直翻转操作x和y表示正方形子矩阵的左上角下标行列下标均从0开始k表示该正方形子矩阵的边长要求垂直翻转该子矩阵的行顺序返回修改后的完整矩阵垂直翻转定义将指定正方形子矩阵的行顺序上下反转子矩阵第一行 ↔ 最后一行交换第二行 ↔ 倒数第二行交换以此类推列内元素顺序保持不变仅修改子矩阵内部元素原矩阵其余区域保持原样。二、解题思路核心步骤拆解精准定位子矩阵边界根据左上角坐标(x,y)和边长k计算出子矩阵的行、列起止下标锁定唯一操作范围避免越界或误改其他区域。提取子矩阵有效片段遍历子矩阵行范围仅截取每一行中对应列范围的元素不改动原矩阵非子矩阵部分的数据。执行垂直翻转将提取的子矩阵行列表整体反转实现上下翻转的核心效果。精准回填数据把翻转后的子矩阵元素逐行逐列放回原矩阵对应位置确保不污染无关区域。返回最终矩阵矩阵为Python可变对象直接原地修改后返回即可无需新建矩阵占用额外内存。关键注意事项题目已保证输入参数合法子矩阵完全在原矩阵范围内无需额外编写边界校验代码。垂直翻转仅针对子矩阵行顺序列元素顺序不可改动严禁直接整行替换防止破坏原矩阵其他列数据。变量命名规范易懂全程添加详细注释兼顾新手理解与代码可读性。三、完整代码实现双版本版本1基础易懂版新手首选✅ 基础版逻辑清晰新手易上手from typing import List class Solution: def reverseSubmatrix(self, grid: List[List[int]], x: int, y: int, k: int) - List[List[int]]: # 1. 计算子矩阵行边界起始行x结束行xk-1 start_row x end_row x k - 1 # 2. 计算子矩阵列边界起始列y结束列yk-1 start_col y end_col y k - 1 # 3. 提取子矩阵所有行仅保留指定列范围 submatrix_rows [] for i in range(start_row, end_row 1): sub_row grid[i][start_col:end_col 1] submatrix_rows.append(sub_row) # 核心逻辑切片反转实现子矩阵垂直翻转 reversed_sub_rows submatrix_rows[::-1] # 4. 将翻转后的数据精准回填原矩阵 row_idx 0 for i in range(start_row, end_row 1): col_idx 0 for j in range(start_col, end_col 1): grid[i][j] reversed_sub_rows[row_idx][col_idx] col_idx 1 row_idx 1 # 5. 返回修改后的矩阵 return grid版本2原地优化版O(1)空间高效推荐⚡ 原地交换版O(1)空间无额外内存开销from typing import List class Solution: def reverseSubmatrix(self, grid: List[List[int]], x: int, y: int, k: int) - List[List[int]]: # 计算子矩阵行列边界 start_row x end_row x k - 1 start_col y end_col y k - 1 # 核心逻辑仅遍历前半部分行对称交换避免重复操作 for i in range(start_row, start_row k // 2): # 计算当前行对应的对称翻转行 mirror_row end_row - (i - start_row) # 仅交换子矩阵列范围内的元素 for j in range(start_col, end_col 1): grid[i][j], grid[mirror_row][j] grid[mirror_row][j], grid[i][j] return grid四、代码逐段解析核心变量说明变量名作用说明start_row/end_row子矩阵的行起始、结束下标锁定垂直操作范围start_col/end_col子矩阵的列起始、结束下标锁定水平操作范围submatrix_rows基础版中存储提取的子矩阵有效行数据mirror_row原地版中计算当前行的对称交换行实现上下翻转关键逻辑精讲子矩阵提取通过切片grid[i][start_col:end_col1]精准截取每行中子矩阵对应的元素完全不影响原矩阵其他列。垂直翻转实现利用Python列表切片[::-1]快速反转行顺序是最简洁高效的翻转方式时间复杂度仅O(k)。原地优化核心仅遍历k//2行通过对称下标交换无需额外存储子矩阵空间复杂度降至O(1)效率更高。五、测试用例验证示例1 示例1 测试代码# 输入 grid [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] x 1 y 0 k 3 # 执行 s Solution() result s.reverseSubmatrix(grid, x, y, k) print(result) # 输出[[1,2,3,4],[13,14,15,8],[9,10,11,12],[5,6,7,16]]示例2 示例2 测试代码# 输入 grid [[3,4,2,3],[2,3,4,2]] x 0 y 2 k 2 # 执行 s Solution() result s.reverseSubmatrix(grid, x, y, k) print(result) # 输出[[3,4,4,2],[2,3,2,3]]六、复杂度分析时间复杂度O(k²)基础版提取子矩阵回填数据各遍历k行k列翻转仅O(k)总复杂度由最高项O(k²)决定原地版双层循环遍历k行k列复杂度同样为O(k²)空间复杂度基础版O(k²)额外存储k行k列的子矩阵数据原地版O(1)仅使用临时变量无额外空间开销七、拓展写法参考 极简拓展仅适用于无列限制整行翻转# 整行垂直翻转极简写法本题因限定列范围不可直接使用grid[x:xk]grid[x:xk][::-1]八、全文总结矩阵子矩阵操作的核心是先精准计算边界再执行操作杜绝越界和误改数据这是此类题型的通用解题思路。垂直翻转子矩阵本质是子矩阵行顺序反转新手先学基础版理解逻辑进阶可使用原地版优化空间效率。基础版适合学习理解原地版适合实际工程与刷题两种代码均可直接提交LeetCode无任何语法与逻辑漏洞。本题无隐藏坑点重点考察下标计算与原地操作思维掌握后可快速解决同类矩阵翻转、子矩阵操作题型。本文代码已通过题目全部测试用例验证可直接复制使用欢迎点赞收藏持续更新LeetCode算法题解