给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
请你返回 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]]
提示:
m == grid.length
n == grid[i].length
1 <= m <= 50
1 <= n <= 50
-1000 <= grid[i][j] <= 1000
0 <= k <= 100
Solution1(原地暴力):Code1:/* 原地暴力 */
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
int m = grid.length;
int n = grid[0].length;
List<List<Integer>> res = new ArrayList<>();
if(k == 0){
for(int i=0;i<m;i++){
List<Integer> list = new ArrayList<>();
for(int j=0;j<n;j++){
list.add(grid[i][j]);
}
res.add(list);
}
return res;
}
int count = 0;
while(count != k){
int temp = grid[m - 1][n - 1];
for(int i=0;i<m;i++){
List<Integer> list = null;
if(count == k - 1)
list = new ArrayList<>();
for(int j=0;j<n;j++){
int t_temp = temp;
temp = grid[i][j];
grid[i][j] = t_temp;
if(count == k - 1)
list.add(t_temp);
}
if(count == k - 1)
res.add(list);
}
count++;
}
return res;
}
}
Solution2(降维+循环数组直接定位):二维转一维;数学关系定位每个元素的位置;Code2:/* 二维转一维 + 循环数组直接定位 */
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
int m = grid.length;
int n = grid[0].length;
List<List<Integer>> res = new ArrayList<>();
int len = m * n;
int[] aux = new int[len];
int index = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
aux[index++] = grid[i][j];
}
}
int[] mock = new int[len];
for(int i=0;i<len;i++){
mock[(i + k) % len] = aux[i];
}
List<Integer> list = null;
for(int i=0;i<len;i++){
if(i % n == 0)
list = new ArrayList<>();
list.add(mock[i]);
if((i + 1) % n == 0)
res.add(list);
}
return res;
}
}