给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
思路:
最直接的方法便是对矩阵进行一圈圈的螺旋遍历,首先最外层一圈,第一行最后一行直接相加加,第一列和最后一列采用遍历,注意螺旋遍历后要将已遍历过的数组pop出,以方便下一圈的遍历。
同时需要加一个判断语句,若矩阵只剩下一行或一列需单独处理,防止out range
代码附下,应该还可以简化不少
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
def out(matrix):
cnt = []
if len(matrix) == 1 :
cnt += matrix[0]
elif len(matrix[0]) == 1:
for i in matrix:
cnt += i
else:
cnt += matrix[0]
matrix.pop(0)
for i in range(len(matrix)-1):
cnt += [matrix[i][-1]]
matrix[i].pop(-1)
cnt += matrix[-1][::-1]
matrix.pop(-1)
for i in range(len(matrix)-1,-1,-1):
cnt += [matrix[i][0]]
matrix[i].pop(0)
return cnt
cnt = []
num = len(matrix)*len(matrix[0])
while len(cnt) != num:
cnt += out(matrix)
return cnt
思路2:
使用zip,zip函数可以将多个列表打包,也可以将一个多维列表解包,详情见zip函数用法
所以可以将矩阵转置后逆向输出得到结果
代码附下
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res=[]
while matrix:
res += list(matrix[0])
matrix = list(zip(*(matrix[1:])))[::-1]
return res