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) (同上)