给出一个由二维数组表示的矩阵,以及两个正整数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 矩阵。 所以输出原矩阵。
难度:简单
算法思路:暴力怎样都能过,这里的话采用官方题解的蛮力法做演示,因为自己写的不是很好,我是用一个一维数组作为中间数组来存储然后再赋值到新矩阵中去的,而官方这里给的是采用了java数据结构中的队列,感觉用的挺好的。不过其实最好的话还是不要用中间数组/队列,因为会开辟额外的空间,直接赋值到新矩阵中也不乏是一个好办法,这里就不再赘述了。
public class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int[][] res = new int[r][c];
if (nums.length == 0 || r * c != nums.length * nums[0].length)
return nums;
int count = 0;
Queue < Integer > queue = new LinkedList < > ();
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
queue.add(nums[i][j]);
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
res[i][j] = queue.remove();
}
}
return res;
}
}
执行用时:
5 ms ,在所有 Java 提交中击败了15.83%的用户
内存消耗:
39.6 MB, 在所有 Java 提交中击败了49.47%的用户