Leetcode-1260-二维网格迁移
题目
给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作会引发下述活动:
- 位于
grid[i][j](j < n - 1)的元素会移动到grid[i][j + 1]。 - 位于
grid[i][n - 1]的元素会移动到grid[i + 1][0]。 - 位于
grid[m - 1][n - 1]的元素会移动到grid[0][0]。
请返回 k 次迁移操作后最终得到的 二维网格。
示例 1:

1 | 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 |
示例 2:
1 | 输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 |
示例 3:
1 | 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 |
提示:
m == grid.lengthn == grid[i].length1 <= m <= 501 <= n <= 50-1000 <= grid[i][j] <= 10000 <= k <= 100
思路
一维展开
核心思路是将二维网格展开为一维数组来思考。
对于一个 m × n 的二维网格,元素 grid[i][j] 在一维中的位置(下标)为:
1 | index = i × n + j |
每次迁移相当于所有元素在一维数组中向右移动一位,最后一个元素移动到第一个位置。迁移 k 次后,原来位于一维下标 index 的元素,新位置为:
1 | newIndex = (index + k) % (m × n) |
最后再将一维下标 newIndex 映射回二维坐标:
1 | row = newIndex / n // 行:商 |
举例
以 grid = [[1,2,3],[4,5,6],[7,8,9]],k = 1 为例:
一维展开:[1, 2, 3, 4, 5, 6, 7, 8, 9]
迁移 1 次后:[9, 1, 2, 3, 4, 5, 6, 7, 8]
还原为二维:
1 | [[9, 1, 2], |
复杂度分析
- 时间复杂度:
O(m × n),遍历每个元素一次。 - 空间复杂度:
O(1)(不计返回结果所需的空间)。
代码
1 | class Solution { |
关键点
- 下标映射:
(i, j) → i × n + j,这是二维数组一维化的核心公式。 - 取模运算:
% total处理了循环移动,当k大于总元素数时自动取余。 - 取余与取模的区别:Java 中
%对正数运算即为取余,由于index和k均为非负数,直接使用%即可。
相关题目
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 林间笔记!