重塑矩阵
难度:
标签:
题目描述
在 MATLAB 中,有一个非常有用的函数 reshape
,它可以将一个 m x n
矩阵重塑为另一个大小不同(r x c
)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat
表示的 m x n
矩阵,以及两个正整数 r
和 c
,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape
操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例 1:

输入:mat = [[1,2],[3,4]], r = 1, c = 4 输出:[[1,2,3,4]]
示例 2:

输入:mat = [[1,2],[3,4]], r = 2, c = 4 输出:[[1,2],[3,4]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
代码结果
运行时间: 23 ms, 内存: 16.8 MB
/*
* Problem: Reshape a given m x n matrix to a new r x c matrix while maintaining the original row-wise order.
* This solution uses Java Streams to achieve the same.
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int m = mat.length, n = mat[0].length;
// Check if reshaping is possible
if (m * n != r * c) {
return mat;
}
// Flatten the matrix and collect elements
int[] flatArray = Arrays.stream(mat)
.flatMapToInt(Arrays::stream)
.toArray();
// Create the new reshaped matrix
int[][] reshapedMatrix = new int[r][c];
for (int i = 0; i < r * c; i++) {
reshapedMatrix[i / c][i % c] = flatArray[i];
}
return reshapedMatrix;
}
}
解释
方法:
这个题解的思路是先将二维矩阵 mat 转换为一维数组 nums,然后再根据给定的行数 r 和列数 c 将一维数组重塑为新的二维矩阵。具体步骤如下:
1. 首先判断原始矩阵的元素总数是否等于重塑后矩阵的元素总数,如果不相等则直接返回原始矩阵。
2. 使用列表推导式将二维矩阵 mat 转换为一维数组 nums。
3. 创建一个空列表 reshaped_mat 用于存储重塑后的矩阵。
4. 使用循环从 nums 中按照列数 c 取出元素,每 c 个元素作为一行添加到 reshaped_mat 中。
5. 返回重塑后的矩阵 reshaped_mat。
时间复杂度:
O(m*n)
空间复杂度:
O(m*n)
代码细节讲解
🦆
如果输入的矩阵 mat 是空的,或者包含一些空的子数组,算法会如何处理?
▷🦆
在将二维矩阵转换为一维数组时,算法是否考虑了可能的性能损耗,特别是对于非常大的矩阵?
▷🦆
算法中有没有考虑到当 r 和 c 都为1时的特殊情况,即输出矩阵变成一个一维数组的情况?
▷🦆
在重塑矩阵的循环中,代码为什么选择每次跳过 c 个元素进行分割,这里的逻辑是什么?
▷