1260移行二次元グリッド

問題解決のアイデア:

モジュロ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;
    }
}

 

公開された158元の記事 ウォン称賛13 ビュー20000 +

おすすめ

転載: blog.csdn.net/junjunjiao0911/article/details/104101210