题目描述:https://leetcode-cn.com/problems/transpose-matrix/description/
思路:
这道题目要求输出矩阵的专职,很自然地想到可以利用numpy模块中的函数transpose()
,那么代码可以写成这样:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
import numpy as np
return np.transpose(nums)
但是LeetCode中不允许导入模块,所以要考虑另一种方法。
- 假设所给矩阵A的维数是是 m×n,生成一个n×m的空矩阵B
B[j][i] = A[i][j]
按照这种思路,编写代码:
class Solution:
def transpose(self, A: List[List[int]]) -> List[List[int]]:
m = len(A)
n = len(A[0])
zero = []
B = []
for i in range(0,m):
zero.append(0)
for j in range(0,n):
B.append(zero)
for i in range(m):
for j in range(n):
B[j][i]=A[i][j]
return B
但是把这段代码提交到LeetCode中会报错,错误显示如下:
✘ Wrong Answer
✘ 4/36 cases passed (N/A)
✘ testcase: '[[1,2,3],[4,5,6],[7,8,9]]'
✘ answer: [[3,6,9],[3,6,9],[3,6,9]]
✘ expected_answer: [[1,4,7],[2,5,8],[3,6,9]]
✘ stdout:
这是因为在构建空矩阵的过程中,这句出现了问题:
for j in range(0,n):
B.append(zero)
空矩阵的每一行,都被指向了一个相同的列表(也就是上一步生成的零列表zero
,所以提交结果显示B矩阵每一行都是相同的。知道报错原因之后修改代码:
class Solution:
def transpose(self, A: List[List[int]]) -> List[List[int]]:
m = len(A)
n = len(A[0])
zero = []
B = []
for j in range(0,n):
zero = []
for i in range(m):
zero.append(0)
B.append(zero)
for i in range(m):
for j in range(n):
B[j][i]=A[i][j]
return B
提交通过。
但是,这样写本身比较复杂,计算用时也比较高,在讨论板块看到一种非常简洁的写法:
class Solution:
def transpose(self, A: List[List[int]]) -> List[List[int]]:
return list(zip(*A))
其中,* 将矩阵A解组成n个列表,zip()
函数再按照顺序将这些列表中的对应元素重新打包起来。
这种解法非常简洁高效。