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)