
LeetCode 1260. Shift 2D Grid 题解Go 实现二维网格环形移位与取模映射【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go二维网格的「整体平移」是一类很常见的基础模拟题核心难点在于如何把二维坐标的循环进位用一步取模运算表达出来。本文以 LeetCode 1260 题Shift 2D Grid为例结合 LeetCode-Go 仓库中的题目文档、参考实现与单元测试从迁移规则、一维化数学建模、逐行源码解读到边界用例分析完整拆解这套 O(m×n) 的解法读完即可掌握二维环形数组移位这类题的统一套路。题目回顾二维网格的 k 次迁移给定一个m × n的二维网格grid和一个整数k要求把网格整体迁移k次。每一次迁移操作包含三条规则位于grid[i][j]的元素移动到grid[i][j 1]同一行内右移一格位于grid[i][n - 1]的元素移动到grid[i 1][0]每行最后一个元素进位到下一行行首位于grid[m - 1][n - 1]的元素移动到grid[0][0]右下角元素环绕回左上角。可以看到这本质上是把整个矩阵首尾相接串成一条环形链每个元素向后右、下方向移动一格且移动是循环的。执行k次后返回结果矩阵。官方示例示例 1grid [[1,2,3],[4,5,6],[7,8,9]]k 1输入grid [[1,2,3],[4,5,6],[7,8,9]], k 1 输出[[9,1,2],[3,4,5],[6,7,8]]右下角元素9环绕到[0][0]其余元素依次右移。示例 2grid [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]]k 4输入grid [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k 4 输出[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]由于n 4移动 4 步恰好等于每行内部走一整圈因此等效于把矩阵整体下移一行最后一行搬到第一行。示例 3grid [[1,2,3],[4,5,6],[7,8,9]]k 9输入grid [[1,2,3],[4,5,6],[7,8,9]], k 9 输出[[1,2,3],[4,5,6],[7,8,9]]m × n 9移动 9 步恰好绕完整环一周矩阵恢复原状。约束条件约束项取值范围m grid.length1 m 50n grid[i].length1 n 50元素值grid[i][j]-1000 grid[i][j] 1000迁移次数k0 k 100约束规模很小最多 2500 个元素、100 步即使逐次模拟也能通过但仓库实现选择了一步到位的数学映射解法值得深入学习。核心思路把二维环形移位降维成一维取模问题原文档给出的解题思路是给一个矩阵和一个移动步数 k要求把矩阵每个元素往后移动 k 步最后的元素移动头部循环移动。顺着这个思路最直观的做法是嵌套循环模拟k次每次整体平移一格。但这样复杂度为 O(k×m×n)且需要处理大量边界搬运逻辑。更优雅的思路是一维化 取模把m × n的矩阵按行展开成一条长度为total m × n的一维序列元素grid[i][j]在一维序列中的下标是pos i × n j向右环形移动k步后它在一维序列中的新下标是pos (pos k) % total再把一维下标还原为二维坐标新行号 pos / n新列号 pos % n。这一下就把行内右移、行末进位、右下角环绕三种看似分裂的规则统一成了一个公式新行号 (i*n j k) / n % m 新列号 (i*n j k) % n仓库源码没有显式构造一维数组而是把上面的除法与取模拆成行偏移与列偏移两部分直接计算避免了i*n j k的中间大数运算也完全等价。数学推导源码中等价公式的来源把pos k拆分(i*n j) k i*n (j k)令k q*n r其中q k/n为整行进位次数r k%n为列内偏移量则新列号 (j r) % n 新行号 (i q (j r n ? 1 : 0)) % m当j r n时列内偏移没有跨行新行号只增加整行进位q当j r n时列偏移溢出额外向下一行进位 1 次行号对m取模处理从最后一行环绕回第一行的情形。由于0 j n且0 r nj r 2n所以跨行最多只有 1 次恰好对应源码中一个if判断。源码解析shiftGrid 的逐行实现仓库中的实现位于 leetcode/1260.Shift-2D-Grid/1260. Shift 2D Grid.go与题目文档中的代码完全一致func shiftGrid(grid [][]int, k int) [][]int { x, y : len(grid[0]), len(grid) newGrid : make([][]int, y) for i : 0; i y; i { newGrid[i] make([]int, x) } for i : 0; i y; i { for j : 0; j x; j { ny : (k / x) i if (j (k % x)) x { ny } newGrid[ny%y][(j(k%x))%x] grid[i][j] } } return newGrid }逐行拆解变量命名与初始化x : len(grid[0])是列数ny : len(grid)是行数m第 37 行用make先构造一个与输入同尺寸的y × x的newGrid注意内层每一行都需要单独make不能直接make([][]int, y)后赋值否则会因 nil 切片访问而 panic。目标行号计算核心ny : (k / x) i // 先加上整行进位次数 if (j (k % x)) x { // 列偏移跨行时再补 1 ny } newGrid[ny%y][...] grid[i][j]k / x是整行进位量qk % x是列内偏移rj r x判断列偏移是否跨行跨行则行号加 1ny % y对行号取模完成最后一行环绕到第一行的闭环。目标列号计算(j (k % x)) % x列号同样用取模处理环形回绕与上面数学推导中的新列号 (j r) % n完全对应。执行流程外层遍历每一行i内层遍历每一列j把grid[i][j]写入newGrid中映射后的位置最后返回newGrid。整个过程中不修改输入矩阵符合函数式风格便于测试与复用。复杂度与正确性分析时间复杂度O(m×n)。双层循环恰好遍历全部m × n个元素每个元素做常数次算术运算不随k的增大而增加即使k 100也只需一轮映射。空间复杂度O(m×n)。需要一个与输入等尺寸的结果矩阵newGrid。正确性(i*n j k)的取模映射与逐次模拟完全等价因为环形移动 k 步与直接取模定位在数学上是同一操作。对比逐次模拟方案每次 O(m×n)共 k 次总计 O(k×m×n)取模方案在k较大时优势明显也彻底规避了逐次搬运时繁琐的边界交换逻辑。测试用例从测试文件看正确性验证仓库为本题编写了完整测试位于 leetcode/1260.Shift-2D-Grid/1260. Shift 2D Grid_test.go。测试采用para1260/ans1260结构封装输入与期望输出并通过question1260组合成用例表驱动执行其中一组用例恰好完整覆盖了各类边界情况输入网格k期望输出覆盖的边界点[[3,7,8],[9,11,13],[15,16,17]]2[[16,17,3],[7,8,9],[11,13,15]]行内偏移 部分元素跨行进位[[1,10,4,2],[9,3,8,7],[15,16,17,12]]10[[4,2,9,3],[8,7,15,16],[17,12,1,10]]k n整行进位q 2且r 2出现元素环绕回顶部[[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]]4[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]k n每行恰好走一整圈等效整体下移一行[[1,2,3],[4,5,6],[7,8,9]]9[[1,2,3],[4,5,6],[7,8,9]]k m × n环绕一整周后恢复原状第二组用例k 10m 3n 4是很好的验证样本k/n 2k%n 2展开一维下标后(0,0)位置的1落到(2,2)(0,3)位置的2落到(3,1)(2,3)位置的12环绕回(2,1)——行号取模与列号取模同时生效与期望输出完全吻合。此外从代码结构还可以推断0 k 100的约束保证了k/x不会过大但即使约束放宽如k远大于m × n取模公式依然成立无需特殊处理。运行与验证仓库根目录的 gotest.sh 给出了标准的测试与覆盖率收集方式go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...针对本题单独运行go test -run Test_Problem1260 -v ./leetcode/1260.Shift-2D-Grid/测试运行时会打印每个用例的输入与shiftGrid的实际输出对应fmt.Printf的输出语句方便与期望结果逐项比对。该仓库以 100% test coverage 为基准每个题解目录均配套同名_test.go本题测试文件中的用例组即是对该题解正确性的直接证据。举一反三一维旋转与二维移位的统一视角本题是经典一维数组旋转问题如 189. Rotate Array把数组右移 k 位的二维推广。两者的共同点是环形结构 取模定位一维new[(i k) % n] old[i]二维把行号、列号分别拆解后同样只需两次取模。掌握了先一维展开、再取模映射、最后还原二维坐标的思考路径后遇到类似矩阵整体平移/旋转/蛇形读取的题目例如仓库中的 48. Rotate Image、54. Spiral Matrix 等矩阵类题解都可以快速定位到坐标映射的核心矛盾而不会被表面的边界规则带偏。小结1260 题虽然被归类为简单题但它同时考察了二维坐标运算、取模性质与环形数组思维。仓库中这份实现用约十行代码完成了从 O(k×m×n) 模拟到 O(m×n) 映射的优化配合 4 组针对性测试用例是一份值得反复研读的矩阵移位模板。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考