数组-566-重塑矩阵

题目:在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
 
示例 1:
 
输入:
nums =
[[1,2],
 [3,4]]
r = 1, c = 4
输出:
[[1,2,3,4]]
解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
示例 2:
 
输入:
nums =
[[1,2],
 [3,4]]
r = 2, c = 4
输出:
[[1,2],
 [3,4]]
解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。
注意:
给定矩阵的宽和高范围在 [1, 100]。
给定的 r 和 c 都是正数。
 
思路:
该题的难点在于怎么把原来的数组按照一行一行的取放入新的数组中;
因为取数据和放数据是一个先取先放的过程,自然考虑队列这种数据结构;
方法一:队列:
将原数组的数据一行一行的取放入队列中;再把队列中的数据按队列顺序放入新数组;
代码如下:
 
public int[][] matrixReshape(int[][] nums, int r, int c) {
        if(nums==null || r*c!=nums.length*nums[0].length)
            return nums;
        Queue<Integer> que=new LinkedList<Integer>(); //构造队列
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<nums[0].length;j++){
                que.add(nums[i][j]);
            }
        }
        int [][]newMatrix=new int[r][c];
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                newMatrix[i][j]=que.remove();
            }
        }
        return newMatrix;
        
    }

复杂度分析:

时间复杂度:O(m*n)。我们遍历 m * n元素两次。这里,m 和 n 分别表示给定矩阵的行数和列数。

空间复杂度:O(m*n)。形成的队列大小为 m*n 和数组大小m*n。

 

方法二:在线取存

考虑这样一个问题,能不能在取数据的时候顺便把数据存在新的数组中呢? 其实是可以的,存放一个数据时,新数据的colum++,当colum==c时,代表这一行存满了只要将row++和column=0即可。

代码如下:

 public int[][] matrixReshape(int[][] nums, int r, int c) {
        if(nums==null || r*c!=nums.length*nums[0].length)
            return nums;
        int row=0;
        int column=0;
        int [][]newMatrix=new int[r][c];
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<nums[0].length;j++){
                newMatrix[row][column]=nums[i][j];
                column++;
                if(column==c){
                    row++;
                    column=0;
                }
            }
        }
   }

复杂度分析:

时间复杂度:O(m*n)。我们遍历了m*n元素一次,m 和 n 分别表示给定矩阵的行数和列数。

空间复杂度:O(m*n)。形成的数组大小为 m*n 。

posted @ 2020-05-12 22:22  Yunus  阅读(97)  评论(0编辑  收藏  举报