Skip to content

Commit 170f4fa

Browse files
author
Karenli
committed
2021.2.17
1 parent b497839 commit 170f4fa

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#### [566. 重塑矩阵](https://leetcode-cn.com/problems/reshape-the-matrix/)
2+
3+
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
4+
5+
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。
6+
7+
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
8+
9+
如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
10+
11+
```
12+
示例 1:
13+
14+
输入:
15+
nums =
16+
[[1,2],
17+
[3,4]]
18+
r = 1, c = 4
19+
输出:
20+
[[1,2,3,4]]
21+
解释:
22+
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
23+
示例 2:
24+
25+
输入:
26+
nums =
27+
[[1,2],
28+
[3,4]]
29+
r = 2, c = 4
30+
输出:
31+
[[1,2],
32+
[3,4]]
33+
解释:
34+
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。
35+
注意:
36+
37+
给定矩阵的宽和高范围在 [1, 100]。
38+
给定的 r 和 c 都是正数。
39+
```
40+
41+
#### 解题思路(二维数组一维表示)
42+
43+
对于一个行数为 m,列数为 n,行列下标都从 0 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 `(i,j) `映射到整数域内,并且它们按照行优先的顺序一一对应着 `[0,mn)` 中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。这个操作在ML中称作**flatten 操作**
44+
45+
这样的映射即为:
46+
`( i, j ) → i × n + j`
47+
48+
同样地,我们可以将整数 x 映射回其在矩阵中的下标,即
49+
50+
```
51+
i=x / n
52+
j=x % n
53+
```
54+
55+
那么题目需要我们做的事情相当于:
56+
57+
- 将二维数组 `nums` 映射成一个一维数组;
58+
- 将这个一维数组映射回 r 行 c 列的二维数组。
59+
60+
**代码演示(Golang)**
61+
62+
```go
63+
func matrixReshape(nums [][]int, r int, c int) [][]int {
64+
m := len(nums) //nums行数
65+
n := len(nums[0]) //nums列数
66+
if m * n != r * c {
67+
return nums
68+
}
69+
res := make([][]int, r)
70+
for i := range res {
71+
res[i] = make([]int, c)
72+
}
73+
74+
for j := 0; j < m * n; j++ {
75+
res[j/c][j%c] = nums[j/n][j%n]
76+
}
77+
return res
78+
}
79+
```
80+
81+
> 时间复杂度:O(rc)。这里的时间复杂度是在重塑矩阵成功的前提下的时间复杂度,否则当 mn = rc 时,需要的时间复杂度仅为 O(1)。
82+
>
83+
> 空间复杂度:O(rc)。
84+
>

0 commit comments

Comments
 (0)