小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。