Given a 2D grid of size m x n and an integer k. You need to shift the grid k times. In one shift operation:
Element at grid[i][j] moves to grid[i][j + 1].
Element at grid[i][n - 1] moves to grid[i + 1][0].
Element at grid[m - 1][n - 1] moves to grid[0][0].Return the __2D grid__ after applying shift operation k times.
Example 1: Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 Output: [[9,1,2],[3,4,5],[6,7,8]] Example 2: Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]] Example 3: Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 Output: [[1,2,3],[4,5,6],[7,8,9]]
Constraints:
m == grid.length
n == grid[i].length
1 <= m <= 50
1 <= n <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100
- code
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
int rowLen = grid.length;
int colLen = grid[0].length;
int[][] res = new int[rowLen][colLen];
for (int row=0; row < rowLen; row++){
for (int col=0; col < colLen; col++){
int newcol = (col + k) % colLen;
int newrow = (row + (col + k) / colLen) % rowLen;
res[newrow][newcol] = grid[row][col];
}
}
List<List<Integer>> resList = new ArrayList<>();
for(int[] rows : res) { // res is 2d array
resList.add(Arrays.stream(rows).boxed().collect(Collectors.toList()));
}
return resList;
}
}
- code
class Solution:
def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int]]:
m = len(grid)
n = len(grid[0])
# k %= m * n
res = [[0] * n for _ in range(m)]
for i in range(m):
for j in range(n):
newj = (k + j) % n
newi = (i + (k + j) // n) % m
res[newi][newj] = grid[i][j]
return res