在MATLAB中,有一个非常有用的函数 reshape
,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
给出一个由二维数组表示的矩阵,以及两个正整数r
和c
,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape
操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
这篇文章的三个版本的代码的效率差别并不是很大
第一版代码:
主要思想就是把原始的数组拉伸放到一个新的列表中, 然后从这个列表中整行整行地取数据
class Solution:
def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:
l1 = len(nums)
l2 = len(nums[0])
if l1 * l2 != r * c:
return nums
flat = []
for li in nums:
flat.extend(li)
res = []
for row in range(r):
res.append(flat[row * c : (row + 1) * c])
return res
这个方法缺点就是flat这个列表占据了多余的空间
第二版代码:
看到大部分人的代码都是一个元素一个元素传递给的新数组
class Solution:
def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:
l1 = len(nums)
l2 = len(nums[0])
if l1 * l2 != r * c:
return nums
res = [[0] * c for _ in range(r)]
for i in range(r * c):
res[i // c][ i % c] = nums[i // l2][i % l2]
return res
第三版代码:
我们看看消耗时间最短的大佬的代码, 使用的双循环, 每次都需要判断是不是需要换行
class Solution:
def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:
if len(nums) * len(nums[0]) != r*c or len(nums) == 0:
return nums
ans = [[0]*c for _ in range(r)]
row = 0
col = 0
for i in range(len(nums)):
for j in range(len(nums[0])):
ans[row][col] = nums[i][j]
col = col + 1
if col == c:
row = row + 1
col = 0
return ans
不知道为啥我电脑的执行的效率就这样的低. 无语了.