leetcode螺旋矩阵 逆天的代码

题目描述

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

方法一

  1. 这不是我写的
  2. 此人充分利用了python特性,用极其简单的代码完成了任务,十分佩服
  3. 叹为观止
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix = list(map(list, zip(*matrix)))[::-1]
        return res

方法二 错误

  1. 自己写的代码
  2. 将问题看成是一个递归问题,输入是一个矩阵A,然后打印他的四周的数字,不断地进行下去就可以了,当然下一次传入的矩阵B是矩阵A去掉了四周的元素
  3. 终止条件是此矩阵要么只有一行,要么只有一列, 按照顺序打印就可以了

之前的错误原因

  1. leetcode运行机制应该是创建了一个Solution的实例,然后去调用函数测试每一个待测数据。
  2. 我使用了类变量,导致整个类变量一直存在,在测试了第二个数据的时候,我的Solution实例中的res没有清空,保存的是之前的结果,导致程序结果出错,这就是类变量的不好地方

改进方法

  1. 在函数内部一开始就将类变量清空,不让历史结果影响当前的函数运行的结果
import numpy as np

class Solution(object):
    res = list()

    def spiralOrder(self, matrix):
        Solution.res = list()
        self.helper(matrix)
        return Solution.res

    def helper(self, matrix):
        if matrix is None or len(matrix) == 0 or len(matrix[0]) == 0:
            return Solution.res
        row = len(matrix)
        col = len(matrix[0])
        if row == 1:
            # 只剩一行 横向打印
            for i in range(col):
                Solution.res.append(matrix[0][i])
            return Solution.res
        if col == 1:
            # 只剩一列 竖向打印
            for i in range(row):
                Solution.res.append(matrix[i][col - 1])
            return Solution.res

        # 从左到右
        for i in range(col):
            Solution.res.append(matrix[0][i])
        # 从上到下
        for i in range(1, row):
            Solution.res.append(matrix[i][col - 1])
        # 从右到左
        for j in range(col - 2, -1, -1):
            Solution.res.append(matrix[row - 1][j])
        # 从下到上
        for j in range(row - 2, 0, -1):
            Solution.res.append(matrix[j][0])
        matrix = np.array(matrix)
        new_matrix = matrix[1: len(matrix) - 1, 1: len(matrix[0]) - 1]
        self.helper(new_matrix)

你可能感兴趣的:(leetcode螺旋矩阵 逆天的代码)