从零开始刷LeetCode:[867] 新21点

题目描述: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中不允许导入模块,所以要考虑另一种方法。

  1. 假设所给矩阵A的维数是是 m×n,生成一个n×m的空矩阵B
  2. 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() 函数再按照顺序将这些列表中的对应元素重新打包起来。
这种解法非常简洁高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值