题目
给你一个 m 行 n 列的矩阵,请按照顺时针螺旋顺序 ,返回矩阵中的所有元素。
方法
思路同上,需要注意的是此矩阵行数和列数可以不同,所以在输出最后几个数的时候需要分类讨论。
- 当此矩阵的行数等于列数且行数列数为奇数时,无法通过 while 循环输出最后一个数
例如:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
起始值:left = 0 right= 2 up = 0 down = 2
第一次循环后:left = right = up = down = 1
无法继续进入循环,但仍剩余数字 5 - 当此矩阵的行数小于列数且行数为奇数时,无法通过 while 循环输出最内层行的所有数
例如:
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
起始值:left = 0 right= 3 up = 0 down = 2
第一次循环后:left = 1 right = 2 up = down = 1
无法继续进入循环,但仍剩余数字 6 和 7 - 当此矩阵的行数大于列数且列数为奇数时,无法通过 while 循环输出最内层列的所有数
例如:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
起始值:left = 0 right= 2 up = 0 down = 3
第一次循环后:left = right = 1 up = 1 down = 2
无法继续进入循环,但仍剩余数字 5 和 8
class Solution(object):
def spiralOrder(self, matrix):
m = len(matrix)
n = len(matrix[0])
left = 0
right = n - 1
up = 0
down = m - 1
result = []
if matrix is None:
return result
while left < right and up < down:
for x in range(left, right):
result.append(matrix[up][x])
for x in range(up, down):
result.append(matrix[x][right])
for x in range(right, left, -1):
result.append(matrix[down][x])
for x in range(down, up, -1):
result.append(matrix[x][left])
left = left + 1
right = right - 1
up = up + 1
down = down - 1
if m == n and m % 2 == 1:
result.append(matrix[m//2][n//2])
elif left < right and up == down:
for x in range(left, right + 1):
result.append(matrix[up][x])
elif left == right and up < down:
for x in range(up, down + 1):
result.append(matrix[x][left])
return result
相关知识
-
len(list):
计算列表的元素个数 -
list.append():
向列表中添加元素