1260. 二维网格迁移

解题思路:

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;
    }
}
发布了158 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/junjunjiao0911/article/details/104101210