题目描述
给定一个包含 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]
方法一
- 这不是我写的
- 此人充分利用了python特性,用极其简单的代码完成了任务,十分佩服
- 叹为观止
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
方法二 错误
- 自己写的代码
- 将问题看成是一个递归问题,输入是一个矩阵A,然后打印他的四周的数字,不断地进行下去就可以了,当然下一次传入的矩阵B是矩阵A去掉了四周的元素
- 终止条件是此矩阵要么只有一行,要么只有一列, 按照顺序打印就可以了
之前的错误原因
- leetcode运行机制应该是创建了一个Solution的实例,然后去调用函数测试每一个待测数据。
- 我使用了类变量,导致整个类变量一直存在,在测试了第二个数据的时候,我的Solution实例中的res没有清空,保存的是之前的结果,导致程序结果出错,这就是类变量的不好地方
改进方法
- 在函数内部一开始就将类变量清空,不让历史结果影响当前的函数运行的结果
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)