問題解決のアイデア:
モジュロKのまず、kがの倍数である場合ので、NまたはM * M * K = 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;
}
}