566.重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例1:
方法一:二维数组的一维表示
对于一个行数为 m,列数为 n,行列下标都从 00 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 (i, j)(i,j) 映射到整数域内,并且它们按照行优先的顺序一一对应着 [0, mn)中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。
映射公式:(i,j)→ i * n + j
同样,我们也可以将整数x映射回其在矩阵中的下标即:
i = x//n n为列数,即每行有多少个元素,x//n即排了完整的几行 ,i即为第几行
j = x %n % 取余操作,即不完整的那一行排了几个元素,j即第几列
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
m , n = len(mat) , len(mat[0]) # m,n为行数与列数
if m * n != r * c: # 判断是否能被重塑,只有元素个数相等的情况下才能被重塑,否则返回原矩阵
return mat
res = [[0] * c for _ in range(r)] # 重塑后要返回的矩阵
for x in range(m*n): # 挨个遍历原矩阵中的元素
res[x // c][x % c] = mat[x // n][x % n] # 赋值
return res
方法二:直接遍历
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
m , n = len(mat) , len(mat[0])
if m * n != r * c:
return mat
res = [] # 要返回的矩阵
temp = [] # 保存每行元素的临时一维数组
for nums in mat: # 遍历
for num in nums:
temp.append(num) # 向临时一维数组中添加元素
if len(temp) == c: # 判断长度,长度 = c,则向res中添加
# res.append(temp)
res = res + [temp] # 与append所起作用一样
temp = [] # 添加完成后temp数组置为空
return res
方法三:队列(简洁)
class Solution:
def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
# m , n = len(mat) , len(mat[0])
# if m * n != r * c:
# return mat
queue = [num for row in mat for num in row] if r * c == len(mat)*len(mat[0]) else []
return [[queue.pop(0) for _ in range(c)] for _ in range(r)] if queue else mat