python 顺时针打印矩阵的超简洁代码

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)的特点,可以通过多个测试用例的检验,是一种非常实用的算法。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签