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)