重塑矩阵Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
在 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
# 思路
不管目标矩阵是什么样的,都先将原来的矩阵转成一维数组,然后再将数组转换成目标矩阵
# 解法
class Solution {
// 不管目标矩阵是什么样的,都先将原来的矩阵转成一维数组,然后再将数组转换成目标矩阵
public int[][] matrixReshape(int[][] mat, int r, int c) {
//矩阵的行和列
int i = mat.length;
int j = mat[0].length;
//不可操作,返回原矩阵
if(r == 0 || c == 0 || (r == i && c == j)||((i * j) != (r * c))){
return mat;
}
int[][] res = new int[r][c];
int[] temp = new int[r * c];
int index = 0;
//不管目标矩阵是什么样的,先将原矩阵转换成数组,然后再转换成目标矩阵
for(int k = 0; k < i; k++){
for(int p = 0; p < j; p++){
temp[index++] = mat[k][p];
}
}
//数组转换成矩阵,容易找到下标的规律,而且可以减少循环的层数
for(int k = 0; k < r; k++){
for(int p = 0; p < c; p++){
res[k][p] = temp[k * c + p];
}
}
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 总结
- 分析出几种情况,然后分别对各个情况实现