来源于力扣566
在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] ]
解释:
没有办法将22矩阵转化为24矩阵。所以输出原矩阵。
思路:
先把二维数组的元素放到一维数组中,判断二维数组元素的个数与r*c的积比较,如果不相等,输出原数组;如果相等,把一维数组的元素依次放到二维数组中即可。
Java代码:
package 面试金典;
public class test009 {
public static void main(String[] args) {
int[][] arr= {{1,2},{3,4}};
int r=1,c=4;
//System.out.println(arr.length);//行
//System.out.println(arr[0].length);//列
int[][] num=matrixReshape(arr,r,c);
for(int i=0;i<num.length;i++) {
for(int j=0;j<num[0].length;j++) {
System.out.print(num[i][j]+" ");
}
System.out.println();
}
}
public static int[][] matrixReshape(int[][] nums, int r, int c) {
int k1=nums.length*nums[0].length;//计算二维数组的总元素个数
int[] array=new int[k1];
int k=0,s=0;
for(int i=0;i<nums.length;i++) {
for(int j=0;j<nums[0].length;j++) {
array[k++]=nums[i][j];//把二维数组元素的值赋给一维数组
}
}
int k2=r*c;
int[][] arr1=new int[r][c];
if(k1==k2) {
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++) {
arr1[i][j]=array[s++];//把一维数组元素的值赋给二维数组
}
}
return arr1;//返回新数组
}
return nums;//返回原数组
}
}