这个问题,再用将矩阵用图形表示出来之后更容易思考。我们可以注意到,打印矩阵的时候,我们可以将过程分解成一圈圈打印。那么有几层就有几次循环。那么如何判断矩阵里有几层圈圈呢,最关键的点在于坐上角的位置,因为这个位置不论矩阵形状如何,其坐标里的X,Y总是相等的,并且满足当循环没有终止时,该位置横坐标值的两倍小于矩阵列的数量,该位置纵坐标的
这个算法的时间复杂度是O(N),空间复杂度是O(N)。
class Solution:
def spiralOrder1(self, matrix: List[List[int]]) -> List[int]:
self.ans = []
if matrix == []:
return self.ans
numOfRows, numOfColumns = len(matrix), len(matrix[0])
start = 0
while start * 2 < numOfRows and start * 2 < numOfColumns:
self.printCircle(matrix, numOfRows, numOfColumns, start)
start += 1
return self.ans
def printCircle(self, matrix, numOfRows, numOfColumns, start):
endX, endY = numOfColumns - 1 - start, numOfRows - 1 - start
for i in range(start, endX+1):
self.ans.append(matrix[start][i])
if start < endY:
for i in range(start + 1, endY+1):
self.ans.append(matrix[i][endX])
if start < endX and start < endY:
for i in range(endX - 1, start-1, -1):
self.ans.append(matrix[endY][i])
if start < endX and start < endY - 1:
for i in range(endY - 1, start, -1):
self.ans.append(matrix[i][start])
def spiralOrder2(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
res += matrix.pop(0)
matrix = list(zip(*matrix))[::-1]
return res
PREVIOUSjz028.对称的二叉树
NEXTlc055.跳跃游戏