题目要求是,给出一个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])