二维网格迁移

1260. 二维网格迁移

难度简单79

给你一个 mn 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 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 次迁移操作后最终得到的 二维网格

示例 1:

img

1
2
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]

示例 2:

img

1
2
输入: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]]

示例 3:

1
2
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
输出:[[1,2,3],[4,5,6],[7,8,9]]

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m <= 50
  • 1 <= n <= 50
  • -1000 <= grid[i][j] <= 1000
  • 0 <= k <= 100

题解

直接使用模拟的方式即可推断

假定矩阵grid的行列长度分别为n, m,首先对 k 进行求余操作,即 k %= (m * n),然后使用模拟的方式得到迁移后的矩阵,对于迁移的元素索引为i,j, 该元素迁移前则在i, j-k位置,有以下两种情况:

  • j-k>=0,可以直接迁移前的i, j-k的元素赋给迁移后的矩阵
  • j-k<0,那么向上一行查找,即i--k已经迁移了j+1个元素,需要减去,即j=m-1,再判断是否j-k<0成立,如果成立,继续这一步操作,其中,如果i<0,则i=n-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
int n = grid.length, m = grid[0].length;
k %= (n * m);
List<List<Integer>> res = new ArrayList<List<Integer>>();
for (int i = 0; i < n; i++) {
List<Integer> temp = new ArrayList<Integer>();
for (int j = 0; j < m; j++) {
int tempi = i, tempj = j, tempk = k;
while (tempj - tempk< 0) {
if (tempi == 0)
tempi = n-1;
else
tempi--;
tempk -= (tempj + 1);
tempj = m-1;
}
temp.add(grid[tempi][tempj-tempk]);
}
res.add(temp);
}
return res;
}
}
  • 时间复杂度:$O(nmk)$
  • 空间复杂度:$O(nm)$

image-20220720153625347


1260二维网格迁移
http://example.com/2022/07/20/leetcode每日一题/1260.二维网格迁移/
作者
madao33
发布于
July 20, 2022
许可协议