【Leetcode】 566. Reshape the Matrix

Description

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

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.

Note

1.The height and width of the given matrix is in range [1, 100].
2.The given r and c are all positive.

Solution

First

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
public static int[][] matrixReshape(int[][] nums, int r, int c) {
int size = nums.length * nums[0].length;
int[][] nums1 = new int[r][c];
if (size != r * c) {
return nums;
} else {
int[] trans = new int[size];
int n = 0;
while (n < size) {
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[0].length; j++) {
trans[n] = nums[i][j];
n++;
}
}
}
int m = 0;
while (m < size) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
nums1[i][j] = trans[m];
m++;
}
}
}
}
return nums1;
}

Optimization

1
2
3
4
5
6
7
8
9
10
11
public int[][] matrixReshape(int[][] nums, int r, int c) {
if (nums.length * nums[0].length != r * c) {
return nums;
} else {
int[][] nums1 = new int[r][c];
for (int i = 0; i < r * c; i++) {
nums1[i/c][i%c] = nums[i/nums[0].length][i%nums[0].length];
}
return nums1;
}
}

Summary

开始不想写这道题,但是发现自己做这道题的速度还是不够快,用了一个很愚蠢的转储方法,复杂度到了O(n^3),其实完全不至于,这种代码很容易成为大题的一小部分,如果这部分写的这么慢,大题不要想顺利做完了。

坚持原创技术分享,您的支持将鼓励我继续创作!