leetcode刷题-566重塑矩阵

250 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode566-重塑矩阵

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

解题思路分析

解法1

本解法主要是先对原始矩阵进行数据处理,将原矩阵经过一次遍历修改为一维数组。遍历是要注意应该按行进行遍历,逐行遍历成新的数组。由于存在无法形成目标矩阵的情况,因此要注意需要对元素的数量进行一次比较,如果数目不等则直接输出原数组。再对形成的数组按行列重新存储为目标二维数组,即得到所需结果。 代码如下:

public int[][] matrixReshape(int[][] mat, int r, int c) {
    if(mat.length == 0){
        return new int[0][0];
    }
    int[] array = new int[mat.length * mat[0].length];
    for (int i = 0; i < mat.length; i++) {
        for (int j = 0; j < mat[i].length; j++) {
            array[mat[i].length * i + j] = mat[i][j];
        }
    }
    if(c * r != array.length){
        return mat;
    }
    int[][] result = new int[r][c];
    for (int i = 0; i < r; i++) {
        int[] item = new int[c];
        for (int j = 0; j < c; j++) {
            item[j] = array[i * c + j];
        }
        result[i] = item;
    }
    return result;
}

复杂度分析

  • 时间复杂度 o(r*n)
  • 空间复杂度 o(r*n)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。