566. Reshape the Matrix

题目描述和难度

  • 题目描述:

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

给出一个由二维数组表示的矩阵,以及两个正整数rc,分别表示想要的重构的矩阵的行数和列数。

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

如果具有给定参数的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. 给定矩阵的宽和高范围在 [1, 100]。
  2. 给定的 r 和 c 都是正数。

思路分析

求解关键:我答这道题的时候没有用到任何算法的知识。
起初我想把这个二维矩阵复制到一个一维矩阵中,再写入新矩阵。
后来我觉得没有必要复制一个矩阵出来,直接在遍历的时候边读边写就可以了,设置一个计数器即可。
就如同我们写字,写完一行,跳到下一行,从头开始写一样。

参考解答

参考解答1

import java.util.Arrays;

public class Solution {

    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int row = nums.length;
        if (row == 0) {
            return nums;
        }
        int col = nums[0].length;
        // 如果型号不相等,则没有办法转换,根据题意,直接返回原始矩阵
        if (row * col != r * c) {
            return nums;
        }
        int[][] ret = new int[r][c];
        // 设置一个计数器
        int counter = 0;
        // 新矩阵的行坐标
        int x = 0;
        // 在遍历原矩阵的时候就可以直接给新矩阵赋值了
        // 规则就是从左向右,如果越界了,就重置,并且行号加 1
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                ret[x][counter] = nums[i][j];
                counter++;
                if (counter == c) {
                    // 越界,重置列坐标,行号 + 1
                    counter = 0;
                    x++;
                }
            }
        }
        return ret;
    }

    public static void main(String[] args) {
        int[][] nums = new int[][]{
                {1, 2, 3, 4, 5, 6},
                {7, 8, 9, 10, 11, 12}
        };
        int r = 4;
        int c = 3;
        Solution solution = new Solution();
        int[][] matrixReshape = solution.matrixReshape(nums, r, c);
        for (int i = 0; i < matrixReshape.length; i++) {
            System.out.println(Arrays.toString(matrixReshape[i]));
        }
    }
}

本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0566-reshape-the-matrix ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com