题目要求是,给出一个N,要求螺旋输出N*N的矩阵:
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5
虽然很多说法都说不断判断边界条件的转换会使代码写得十分繁复。但其实这里有个trick,打印的方向始终是从左往右→从上往下→从右往左→从下往上的。那么我们只要先用一个list装填所有的数,用是否为0判断边界即可,这样用两层的while判断就能写出来。
但写了一次,还是会很复杂……
刚才其实说到:打印的方向始终是从左往右→从上往下→从右往左→从下往上的。所以可以想到递归,实际上这个递归相当好写。
# offer25-solution
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
if not matrix or len(matrix) <= 0 or len(matrix[0]) <= 0:
return
start = 0
rows = len(matrix)
columns = len(matrix[0])
res = []
while (columns > start * 2 and rows > start * 2):
self.printMatrixInCircle(matrix, columns, rows, start, res)
start += 1
return res
def printMatrixInCircle(self, matrix, columns, rows, start, res):
endX = columns - 1 - start
endY = rows - 1 - start
# 从左到右打印一行
for i in range(start, endX + 1):
res.append(matrix[start][i])
# 从上到下打印一列
if start < endY:
for i in range(start + 1, endY + 1):
res.append(matrix[i][endX])
# 从右到左打印一行
if start < endX and start < endY:
for i in range(endX - 1, start - 1, -1):
res.append(matrix[endY][i])
# 从下到上打印一列
if start < endX and start < endY - 1:
for i in range(endY - 1, start, -1):
res.append(matrix[i][start])