566. 重塑矩阵『简单』

题目来源于力扣(LeetCode

一、题目

566. 重塑矩阵

题目相关标签:数组

注意:

  1. 给定矩阵的宽和高范围在 [1, 100]。
  2. 给定的 r 和 c 都是正数。

二、解题思路

2.1 list 列表存取方式

  1. 遍历 nums 数组中的元素,存储到 list 列表中

  2. 判断 list 列表中的元素个数是否等于 r 乘 c 组成的矩阵能够存储的元素个数

  3. 元素个数不相等时,即无法转换成新矩阵,返回原矩阵

  4. 创建 r * c 的矩阵,即二维数组,并进行遍历

  5. 逐个取出 list 列表中的元素,存储到遍历的二维数组中

2.2 数组元素存储到另一个二维数组

  1. 判断 nums 矩阵中的元素个数是否正好等于 r 乘 c 组成的矩阵能够存储的元素个数

  2. nums 矩阵正好可以转换成新矩阵时,遍历 nums 矩阵,进行转换的操作

  3. 关键点:如何控制新矩阵的索引

  4. 定义变量 count 记录已经存储的元素个数

  5. 应该存入的行 = count / 新数组的列数,应该存入的列 = count % 新数组的列数

三、代码实现

3.1 list 列表存取方式

public static int[][] matrixReshape(int[][] nums, int r, int c) {
    // r 与 c 组成新矩阵的元素个数
    int product = r * c;
    List<Integer> list = new ArrayList<>();

    for (int i = 0; i < nums.length; i++) {
        for (int j = 0; j < nums[i].length; j++) {
            // 二维数组中的元素加入到 list 列表中,方便后续的取出元素
            list.add(nums[i][j]);
        }
    }
    // 判断 list 中元素的个数与新矩阵的元素个数大小(乘积)是否相等
    if (list.size() != product) {
        // 不相等时说明无法转换,输出原矩阵
        return nums;
    }
    // list 列表的索引,从 0 开始
    int i = 0;
    int[][] ans = new int[r][c];
    for (int j = 0; j < r; j++) {
        for (int k = 0; k < c; k++) {
            // 将 list 中的元素添加到新创建的矩阵中
            ans[j][k] = list.get(i++);
        }
    }
    return ans;
}

3.2 数组元素存储到另一个二维数组

public static int[][] matrixReshape(int[][] nums, int r, int c) {
    int m = nums.length;
    int n = nums[0].length;
    // nums 中的元素个数不等于 r * c 时,返回原矩阵
    if (m * n != r * c) {
        return nums;
    }

    int count = 0;
    int[][] ans = new int[r][c];
    // 遍历二维数组
    for (int[] row : nums) {
        for (int num : row) {
            // 二维数组中的元素,转到另一个二维数组,当存储的元素个数大于列数时,换行
            // 应该存入的行 =  count / 新数组的列数
            // 应该存入的列 =  count % 新数组的列数
            ans[count / c][count % c] = num;
            // 每次遍历都记录已经存储的元素个数
            count ++;
        }
    }
    return ans;
}

四、执行用时

4.1 list 列表存取方式

4.2 数组元素存储到另一个二维数组

五、部分测试用例

public static void main(String[] args) {
    int[][] nums = {{1, 2}, {3, 4}};
    int r = 1, c = 4;  // output:{{1, 2, 3, 4}}

//    int[][] nums = {{1, 2}, {3, 4}};
//    int r = 2, c = 4;  // output:{{1, 2}, {3, 4}}
    int[][] result = matrixReshape(nums, r, c);
    System.out.println(Arrays.toString(result));
}
posted @ 2020-05-24 23:46  知音12138  阅读(180)  评论(0编辑  收藏  举报