1. 问题描述:
给你一个 m 行 n 列的二维网格 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:
输入: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
2. 思路分析:
首先需要读清楚题目,根据题目的意思可以知道我们需要将二维列表的所有元素都往后移动一位,所以我们可以在循环中遍历二维列表的行与列,这里可以使用倒序遍历的方式来进行遍历,从最后一行开始移动,这样移动元素的时候会方便一点,因为是需要移动k次,所以我们只需要递归调用即可,这里的递归调用比较简单,相当于是循环来的,每一次将k减1即可,等到k等于0的时候直接返回grid二维列表即可
3. 代码如下:
class Solution:
def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int]]:
if k == 0: return grid
k %= len(grid) * len(grid[0])
if k == 0: return grid
# 其实题目的意思是让我们往后面移动一个位置即可
last = grid[len(grid) - 1][len(grid[0]) - 1]
# 倒序遍历二维列表注意第二个参数是-1才可以到下表为0的位置, 第三个参数负数表示的意思是倒序
for row in range(len(grid) - 1, -1, -1):
for col in range(len(grid[row]) - 2, -1, -1):
# print(grid[row][col])
grid[row][col + 1] = grid[row][col]
if row > 0:
# 将上一行的最后一个元素放到当前行的首个元素
grid[row][0] = grid[row - 1][len(grid[row]) - 1]
grid[0][0] = last
# 使用递归来解决
return self.shiftGrid(grid, k - 1)