1. 简介
矩阵按照顺时针方向打印出来是一个经典的问题,它可以在面试中被频繁提到。本文将介绍一种非常简洁的python代码实现该问题的方法。此算法时间复杂度为O(n^2),空间复杂度为O(1)。可以看出,时间复杂度与空间复杂度都是非常优秀的。
2. 实现思路
我们可以将矩阵分解为多个环,每个环都是从左上角开始,按照右->下->左->上的方式打印一圈。然后递归地对内部的环进行相同的打印操作。如果我们选择每次调用一层递归的方式来处理内层环,那么时间复杂度将会是O(n^2),空间复杂度将为O(n)。但我们可以通过将内部环的四个方向拆分为两次遍历,从而能够使用相同的递归调用方式,这样就能够将空间复杂度降低为O(1)。
3. 实现代码
3.1 总体代码
def printMatrix(matrix):
result = []
if not matrix:
return result
rows = len(matrix)
cols = len(matrix[0])
start = 0
while cols > start * 2 and rows > start * 2:
result += printMatrixInCircle(matrix, cols, rows, start)
start += 1
return result
def printMatrixInCircle(matrix, cols, rows, start):
endX = cols - 1 - start
endY = rows - 1 - start
result = []
# 从左到右打印一行
for i in range(start, endX + 1):
result.append(matrix[start][i])
# 从上到下打印一列
if start < endY:
for i in range(start + 1, endY + 1):
result.append(matrix[i][endX])
# 从右到左打印一行
if start < endX and start < endY:
for i in range(endX - 1, start - 1, -1):
result.append(matrix[endY][i])
# 从下到上打印一列
if start < endX and start < endY - 1:
for i in range(endY - 1, start, -1):
result.append(matrix[i][start])
return result
3.2 总体代码解析
printMatrix函数是本算法的入口,接收一个矩阵作为参数,返回该矩阵顺时针打印出来的结果。
打印顺序是从左上角开始,从左到右、从上到下、从右到左、从下到上,这样形成一圈。然后递归地调用对圈内的矩阵进行相同的打印操作。直到不能再进行递归调用(即矩阵为空,或者圈已经打印完),返回结果集。
3.3 内部函数printMatrixInCircle代码解析
printMatrixInCircle函数是printMatrix函数的辅助函数,用于打印每个圈。它接收4个参数:矩阵matrix,矩阵内部当前圈的列数cols,行数rows,以及当前正在打印的圈的开始点start。
首先,我们需要找到当前圈的结束点endX和endY。endX的值是cols - 1 - start,endY的值是rows - 1 - start。
接下来,我们需要按照从左到右、从上到下、从右到左、从下到上的顺序,分别打印矩阵的一行或者一列。需要注意的是,每个方向的打印起始点都有所不同,需要根据当前圈来进行选择。最后,将得到的所有数字存入结果集result中,返回即可。
4. 测试
下面是本算法的一些测试用例,您可以使用这些用例检验一下算法的正确性。
4.1 测试用例
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]
result = printMatrix(matrix)
print(result) # [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = printMatrix(matrix)
print(result) # [1, 2, 3, 6, 9, 8, 7, 4, 5]
matrix = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
result = printMatrix(matrix)
print(result) # [1, 2, 4, 6, 8, 10, 9, 7, 5, 3]
matrix = [[1]]
result = printMatrix(matrix)
print(result) # [1]
matrix = [[]]
result = printMatrix(matrix)
print(result) # []
4.2 测试结果
对于上述所有测试用例,算法都能够返回正确的结果。
5. 总结
本文详细介绍了一种非常优秀的python代码实现矩阵顺时针打印的方法。该算法具有时间复杂度为O(n^2)、空间复杂度为O(1)的特点,可以通过多个测试用例的检验,是一种非常实用的算法。