1260. 二维网格迁移
题目描述
给你一个 n 行 m 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
每次「迁移」操作将会引发下述活动:
- 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
- 位于 grid[i][m - 1] 的元素将会移动到 grid[i + 1][0]。
- 位于 grid[n - 1][m - 1] 的元素将会移动到 grid[0][0]。
请你返回 k 次迁移操作后最终得到的 二维网格。
题目地址
示例
输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[9,1,2],[3,4,5],[6,7,8]]
题目分析
可以将二维网络转化为一位数组,然后根据k固定访问起点,因为数据是nm的,所以从起点开始,每访问m个数字,形成一个一位数组,添加到二维答案数组中去。
既然访问方式解决了,那么如何确定访问起点呢?
这个就在一位数组中后退k个数组就可以了,记得在过程中确保k>=0 && k<mn,可以通过取余来实现。
java代码
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
List<List<Integer>> listList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
int n = grid.length;
int m = grid[0].length;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
list.add(grid[i][j]);
}
}
k = k % (m*n);
List<Integer> list1 = new ArrayList<>();
int index = m*n-k;
int count = 0;
while(count<m*n){
count++;
list1.add(list.get(index%(m*n)));
index++;
if(count%m == 0){
listList.add(((List)new ArrayList<>(list1).clone()));
list1.clear();
}
}
return listList;
}