题目
给你一个 n 行 m 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
位于 grid[i][m - 1] 的元素将会移动到 grid[i + 1][0]。
位于 grid[n - 1][m - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。
示例 1:
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]
示例 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:
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
输出:[[1,2,3],[4,5,6],[7,8,9]]
提示:
1 <= grid.length <= 50
1 <= grid[i].length <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shift-2d-grid
解题思路
解法稍微有有点儿绕,但是总的思想就是,将k次迁移中行和列的变化独立来看:
1.对列来说,当迁移的次数 k 刚好是列的整数倍的时候(k%m == 0), 矩阵在列上是没有变化的;
2. 对行来说, 每迁移 m 次, 就有一整行发生移动, 每迁移 m*n 次, 矩阵在行和列上都没有变化。
找到规律之后,首先对迁移次数取模,减少重复移动:
代码
class Solution(object):
def shiftGrid(self, grid, k):
"""
:type grid: List[List[int]]
:type k: int
:rtype: List[List[int]]
"""
# obtain the row and col
n = len(grid)
m = len(grid[0])
arr = [[0 for i in range(m)] for j in range(n)]
# shift the col
time = k % m
for i in range(m):
for j in range(n):
arr[j][(i+time)%m] = grid[j][i] # change the order of cols
# shift the row
time = k%(n*m)
# how much rows we need to change
row = time // m
for i in range(n):
grid[(i+row)%n] = arr[i] # change the order of rows
# how much cols we need to change
num_ele = time % m
for i in range(num_ele):
tmp = grid[n-1][i]
# !这里的变换也是以此往下进行的,而不是直接将第一行和最后一行元素交换,之前就错在这里!
for j in range(n-1,0,-1): # 逆序
grid[j][i] = grid[j-1][i]
grid[0][i] = tmp
return grid