ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LeetCode-Go 题解 566:Reshape the Matrix 矩阵重塑(MATLAB reshape 原理与 Go 实现剖析)

LeetCode-Go 题解 566:Reshape the Matrix 矩阵重塑(MATLAB reshape 原理与 Go 实现剖析) LeetCode-Go 题解 566Reshape the Matrix 矩阵重塑MATLAB reshape 原理与 Go 实现剖析【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本文以 LeetCode-Go 仓库中 0566.Reshape-the-Matrix 题解目录 为核心完整讲解 LeetCode 第 566 题「重塑矩阵」的题目背景、判定条件与模拟填充思路并逐行剖析该仓库的 Go 实现与测试用例。读完本文你将掌握元素总数守恒 行遍历填充这一通用矩阵重塑范式并能在不借助额外一维数组的情况下完成原地重排。题目描述MATLAB reshape 的二维数组版本在 MATLAB 中reshape是一个非常有用的函数它可以把一个矩阵重塑为大小不同但保留原始数据的新矩阵。LeetCode 566 题要求用二维数组实现同样的能力给出一个由二维数组表示的矩阵以及两个正整数r和c分别表示想要重构出的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素**以相同的行遍历顺序row-traversing order**填充。如果该 reshape 操作可行且合法则输出新的重塑矩阵否则输出原始矩阵。通俗地说把原矩阵按先从左到右、再从上到下的顺序读出所有元素再按同样的顺序逐行填入新矩阵。关键在于只有元素总数相等时重塑才合法。示例 1展平成单行Input: nums [[1,2], [3,4]] r 1, c 4 Output: [[1,2,3,4]]原矩阵的行遍历序列为[1,2,3,4]将其逐行填入1 × 4的新矩阵即得到[[1,2,3,4]]。示例 2元素总数不匹配返回原矩阵Input: nums [[1,2], [3,4]] r 2, c 4 Output: [[1,2], [3,4]]2 × 2 4个元素无法装进2 × 4 8个格子重塑不合法因此输出原矩阵。数据范围说明给定矩阵的高和宽均在[1, 100]范围内给定的r和c均为正整数。这意味着输入矩阵永不为空nums[0]始终存在后续代码可以直接取len(nums[0])而无需判空这是实现细节中的一个隐含前提。核心解题思路元素总数守恒 行遍历填充这是一道典型的模拟simulation题思路分两步合法性判定设原矩阵为m × n目标矩阵为r × c。只有当m × n r × c时重塑才可行顺序填充按行遍历原矩阵的每个元素以相同的先后顺序逐行填入新矩阵。只要抓住原矩阵的行遍历顺序 新矩阵的填充顺序这一等量关系无论目标矩阵的形状如何变化元素的相对顺序都不会被打乱。这也是 MATLABreshape在底层所遵循的基本语义。Go 实现解析仓库源码逐行剖析LeetCode-Go 仓库在 566. Reshape the Matrix.go 中给出了完整实现整体拆分为三个职责单一的函数func matrixReshape(nums [][]int, r int, c int) [][]int { if canReshape(nums, r, c) { return reshape(nums, r, c) } return nums }matrixReshape是入口函数先调用canReshape做合法性判定可行则调用reshape执行重塑否则原样返回nums。这种判定与执行分离的写法让每个函数只做一件事逻辑清晰、易于测试。合法性判定canReshapefunc canReshape(nums [][]int, r, c int) bool { row : len(nums) colume : len(nums[0]) if row*colume r*c { return true } return false }判定条件就是元素总数守恒len(nums)得到原矩阵行数mlen(nums[0])得到原矩阵列数n只有当m*n r*c时返回true。由于题目保证矩阵高宽在[1, 100]内、r、c均为正整数这里不需要处理空矩阵或零尺寸的边界情况。重塑填充reshapefunc reshape(nums [][]int, r, c int) [][]int { newShape : make([][]int, r) for index : range newShape { newShape[index] make([]int, c) } rowIndex, colIndex : 0, 0 for _, row : range nums { for _, col : range row { if colIndex c { colIndex 0 rowIndex } newShape[rowIndex][colIndex] col colIndex } } return newShape }填充阶段有两个关键点先分配再填充先make出r行再为每一行make出长度为c的切片得到完整的r × c零值矩阵用游标模拟行遍历维护rowIndex与colIndex两个游标。每次写入一个元素后colIndex当colIndex c时说明当前行已写满将colIndex归零、rowIndex换到下一行。由于canReshape已保证元素总数相等双游标恰好会在填完最后一个元素时到达(r, c)的末尾不存在越界或剩余元素的情况。这种写法无需借助额外的一维数组做中转直接在目标矩阵上按位置落值空间上更省。注意仓库源码中使用的变量名colume是column的笔误属于无伤大雅的命名瑕疵不影响功能正确性。读者在自行实现时建议使用规范拼写column。另一种等价实现先展平后按行切片除仓库的双游标方案外另一种常见写法是先读取原矩阵的行遍历序列存入一维切片再按每c个元素切分出一行。这种方案思路更直白先读出来、再切回去但会额外占用O(m×n)的空间仓库的双游标方案在空间上更优。两种方案的时间复杂度相同读者可依据自己对可读性与空间开销的偏好选择。复杂度分析维度复杂度说明时间复杂度O(m×n)需要遍历原矩阵的全部元素各一次与重塑后的尺寸r×c相等空间复杂度O(r×c)需要分配新矩阵存储结果双游标方案无需额外的一维中转数组非法情况O(1)元素总数不等时直接返回原矩阵零拷贝对于m, n ≤ 100的数据范围最坏情况也只需处理 10,000 个元素性能完全无压力这也是 README 中将其称为水题的原因。测试用例与验证仓库在 566. Reshape the Matrix_test.go 中采用本仓库统一的结构体参数化用例风格组织测试用para566封装输入参数nums、r、c用ans566封装期望输出qs : []question566{ {para566{[][]int{{1, 2}, {3, 4}}, 1, 4}, ans566{[][]int{{1, 2, 3, 4}}}}, {para566{[][]int{{1, 2}, {3, 4}}, 2, 4}, ans566{[][]int{{1, 2}, {3, 4}}}}, {para566{[][]int{{1, 2, 3, 4}}, 2, 2}, ans566{[][]int{{1, 2}, {3, 4}}}}, }三个用例覆盖了三种典型场景用例输入期望输出验证点用例 1[[1,2],[3,4]], r1, c4[[1,2,3,4]]2×2 → 1×4 展平成功用例 2[[1,2],[3,4]], r2, c4[[1,2],[3,4]]元素总数不等4≠8返回原矩阵用例 3[[1,2,3,4]], r2, c2[[1,2],[3,4]]1×4 → 2×2 折叠成功其中用例 3 恰好验证了行遍历顺序的正确性虽然目标形状不同但元素仍按1,2,3,4的顺序逐行落位与示例 2 互为逆操作。用例 2 则单独验证了非法输入时原样返回的兜底逻辑。运行方式上可进入对应题解目录执行go test验证本用例也可以使用仓库根目录的 gotest.sh 脚本对整个leetcode包做覆盖率测试该脚本通过go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...一次性对多个包生成单一合法的覆盖率文件。仓库项目的 README 声称 100% test coverage本题的测试结构正是这一质量标准的缩影。边界情况与易错点总结元素总数不匹配m×n ! r×c时必须返回原矩阵这是最容易遗漏的分支仓库通过canReshape单独抽出处理空矩阵题目约束矩阵高宽在[1, 100]所以实现中len(nums[0])是安全的若脱离本题约束自行扩展需要先判断len(nums) 0单行 / 单列互转1×N 与 M×1 的互转如用例 3容易出错验证时建议把这类形状反转用例加入测试填充游标的换行时机写入元素之前判断colIndex c还是之后判断决定了游标复位逻辑的写法。仓库采用写前判断、写后自增读者可对比写后判断两种写法体会差异避免出现列索引越界或漏换行的问题。小结LeetCode 566「重塑矩阵」的核心只有两件事元素总数守恒是重塑合法的充要条件行遍历顺序是填充的唯一次序依据。LeetCode-Go 仓库用matrixReshape/canReshape/reshape三个函数将其拆解为入口调度 可行性判定 游标填充并以双游标方案免去一维中转数组是一份兼顾可读性与空间效率的参考实现。若想进一步查看本题完整代码与测试可继续阅读 题目文档、解法实现 与 测试文件。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表