Reshape the Matrix[LeetCode/Python3/Easy]
題目
在 MATLAB 中有一個方便的函數叫作 reshape
,可以將一個 m x n
的矩陣轉換為一個新的矩陣,大小為 r x c
,並保留其原始數據。
給定一个由二维数组表示的矩阵 mat
,以及两个正整数 r
和 c
,分别表示想要的矩阵的行數和列數。
将矩阵以相同的行遍历顺序重新排列成一个新的矩阵。如果所需大小为给定矩阵大小的子矩阵,则可以进行重塑操作。
如果重新调整大小操作具有合法性,并且可以按照所需大小重塑矩阵,则输出新的重新调整大小后的矩阵;否则,输出原始矩阵。
示例 1:
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
示例 2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
我的答案
直覺解答
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
m = len(mat)
n = len(mat[0])
if m*n != r*c:
return mat
re_mat=[]
rr=0
cc=0
for i in range(m):
for j in range(n):
if cc ==0:
re_mat.append([mat[i][j]])
cc+=1
elif cc == c:
re_mat.append([mat[i][j]])
rr+=1
cc=1
else:
re_mat[rr].append(mat[i][j])
cc+=1
return re_mat
修正寫法
其實只有把上述的判斷是直接用數學式去做陣列索引的計算,以及提前先宣告好完整的re_mat的這列格式,但速度並沒有特別快QQ
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
m = len(mat)
n = len(mat[0])
if m*n != r*c:
return mat
re_mat=[[None for i in range(c)] for i in range(r)]
for i in range(m*n):
re_mat[i//c][i%c]=mat[i//n][i%n]
return re_mat
⚠️ 想特別複習一個點
[[0]*c]*r
這個寫法是把[0]*c複製了r遍,而且是 淺複製
,所以[0]*C發生變更,則r個都會變更,可以看到以下範例, L=[[0]*2]3
的id位址,每行都是一樣的,但 l=[[0 for i in range(2)] for i in range(3)]
的每行位址都不相同。
l=[[0 for i in range(2)] for i in range(3)]
l
#[[0, 0], [0, 0], [0, 0]]
L=[[0]*2]*3
L
#[[0, 0], [0, 0], [0, 0]]
id(L[0])
#4341325504
id(L[1])
#4341325504
id(L[2])
#4341325504
id(l[0])
#4341309120
id(l[1])
#4341305152
id(l[2])
#4341323328
</aside>
留言
張貼留言