解题思路:
1.先对k取模,因为如果k是m*n的倍数或者k=m*n时,应该返回原数组,不需要任何操作,而如果k>m*n,实际上只需要对取模后的k进行操作即可
2.倒序遍历数组,先将数组的最后一个元素保存起来,位于 grid[i][j]
的元素(j<m-1)将会移动到 grid[i][j + 1],
位于 grid[i][m - 1]
的元素将会移动到 grid[i + 1][0],倒数第一个元素会移动到grid[0][0]
3.循环操作第二步k次
4.将二维数组转换为list
时间复杂度O(k*m*n)
空间复杂度O(1)
代码实现:
class Solution {
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
List<List<Integer>> list=new ArrayList<List<Integer>>();
int m=grid[0].length;//列
int n=grid.length;//行
k%=(m*n);
if(k==0){
return toList(grid,n,m,list);
}
for(int p=0;p<k;++p){
int temp=grid[n-1][m-1];//保存倒数第一个元素
for(int i=n-1;i>=0;--i){
for(int j=m-1;j>=0;--j){
if(j==m-1&&i!=n-1){//每一行的最后一个(不包括倒数第一个元素)
grid[i+1][0]=grid[i][j];
}
else if(j<m-1){
grid[i][j+1]=grid[i][j];
}
}
}
grid[0][0]=temp;
}
return toList(grid,n,m,list);
}
//将二维数组转化为list
public List<List<Integer>> toList(int[][] grid,int n,int m,List<List<Integer>> list){
for(int i=0;i<n;++i){
List<Integer> temp=new ArrayList<>();
for(int j=0;j<m;++j){
temp.add(grid[i][j]);
}
list.add(temp);
}
return list;
}
}