566. Reshape the Matrix
题目描述和难度
- 题目描述:
在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 都是正数。
- 题目难度:简单。
- 英文网址:566. Reshape the Matrix 。
- 中文网址:566. 重塑矩阵 。
思路分析
求解关键:我答这道题的时候没有用到任何算法的知识。
起初我想把这个二维矩阵复制到一个一维矩阵中,再写入新矩阵。
后来我觉得没有必要复制一个矩阵出来,直接在遍历的时候边读边写就可以了,设置一个计数器即可。
就如同我们写字,写完一行,跳到下一行,从头开始写一样。
参考解答
参考解答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 。