In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data.
You're given a matrix represented by a two-dimensional array, and two positive integers r and c representing the row number and column number of the wanted reshaped matrix, respectively.
The reshaped matrix need to be filled with all the elements of the original matrix in the same row-traversing order as they were.
If the 'reshape' operation with given parameters is possible and legal, output the new reshaped matrix; Otherwise, output the original matrix.
Example 1:
Input: nums = [[1,2], [3,4]] r = 1, c = 4 Output: [[1,2,3,4]] Explanation: The row-traversing of nums is [1,2,3,4]. The new reshaped matrix is a 1 * 4 matrix, fill it row by row by using the previous list.
Example 2:
Input: nums = [[1,2], [3,4]] r = 2, c = 4 Output: [[1,2], [3,4]] Explanation: There is no way to reshape a 2 * 2 matrix to a 2 * 4 matrix. So output the original matrix.
Note:
- The height and width of the given matrix is in range [1, 100].
- The given r and c are all positive.
我的方法:先将原来的数组存储到一个一维的数组中,然后再将一维数组中的数据一次放入新的二维数组中;
还有一种比较好的方法,不需要额外的存储空间,设定一个count,count来计算没存储到新的数组中,count加1,然后新的数组的行索引为count/c,列索引为count%c,这个方法减少了存储空间!
我自己还有一种方法也不需要额外的存储空间,用一个a来控制每行的输出结束,b来控制列数,a==r之后,让a=0,b++,这样来控制下!
下面是第一种方法:
class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int m = nums.length;
int n = nums[0].length;
int [][] a = new int[r][c];
int []b = new int[m*n];
int bb=0;
int x=0;
if (m*n<r*c){
return nums;
}
else{
for(int i=0;i<m;i++){
for(int j = 0;j<n;j++){
b[bb] = nums[i][j];
bb++;
}
}
for(int i =0;i<r;i++){
for(int j = 0;j<c;j++){
a[i][j] = b[x];
x++;
}
}
return a;
}
}
}
第二种方法:
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;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
res[count / c][count % c] = nums[i][j];
count++;
}
}
return res;
}
}