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 res
3. 复杂度分析:
- 时间复杂度: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 res
4.3 复杂度分析
- 时间复杂度:O(m*n) (m 和 n 分别为矩阵的行数和列数)
- 空间复杂度:O(m*n) (同上)