1. 常规解题思路
此题一画出示例矩阵,就可以找到常规解题思路:找到四个角的边界,然后模拟路径遍历矩阵。
2. 核心代码:
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
#还是先判断矩阵是否存在
if not matrix:
return []
#定义要打印的数组
res = []
#定义四个边界角
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
#从左到右,根据边界打印
for i in range(l, r + 1): res.append(matrix[t][i])
#边界向内收缩
t += 1
#是否打印完毕
if t > b:
break
#从上到下
for i in range(t, b + 1): res.append(matrix[i][r])
r -= 1
if l > r:
break
#从右到左
for i in range(r, l - 1, -1): res.append(matrix[b][i])
b -= 1
if t > b:
break
#从下到上
for i in range(b, t - 1, -1): res.append(matrix[i][l])
l += 1
if l > r:
break
return res3. 复杂度分析:
- 时间复杂度:O(m*n) (m,n 分别是矩阵的行数和列数)
- 空间复杂度:O(1) (四个边界 l , r , t , b 使用常数大小的 额外空间( res 为必须使用的空间))
--------------------------------------------------------我是解法二的分割线---------------------------------------------------------------------
4. 解法二:逆转矩阵
4.1 思路 + 图解
但是这个常规解法还是略微复杂点,下面介绍一种逆向思维思路👇:
每剔除矩阵最上面一行数据,并添加到顺序列表;然后逆时针90°旋转剩下的矩阵,重复之前的剔除操作;这样直到矩阵为空,此时顺序列表的数字就是我们要找的 顺时针打印的数字!
具体步骤可以看下面的这几个示例图:
4.2 核心代码
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
res = [] #定义一个顺序列表
while matrix:
res += matrix.pop(0) #每次去除矩阵最上面一行的数据,并添加到顺序列表中
matrix = list(zip(*matrix))[::-1] #紧接着逆时针90°旋转矩阵,重复前面的步骤直到矩阵为空
return res4.3 复杂度分析
- 时间复杂度:O(m*n) (m 和 n 分别为矩阵的行数和列数)
- 空间复杂度:O(m*n) (同上)

京公网安备 11010502036488号