[leetcode]剑指 Offer 29. 顺时针打印矩阵

前言:剑指offer刷题系列

问题:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例:

markdown 复制代码
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

思路:

看到这个题目我首先想的是手动模拟,每次按一个方向输出数字,直到这个方向输出到头,就按顺时针方向从另一个方向开始输出,直到矩阵中所有数字都输出完毕。

首先判断一下,如果输入的 matrix 为空,则返回一个空列表。

然后按照螺旋顺序遍历给定的二维矩阵。具体来说,通过创建一个新的扩展矩阵 re_matrix 来实现。新矩阵的大小比原矩阵的大小多两行两列,并将原矩阵中的元素复制到新矩阵中对应的位置。然后,使用变量 ij 来追踪当前遍历到的位置,并使用变量 flag 来表示当前遍历的方向。

在遍历过程中,首先将当前位置的元素添加到结果列表 res 中,并将新矩阵中对应位置的元素设置为 '0'。然后根据当前遍历方向和新矩阵中相邻位置的元素值来更新遍历方向。最后,根据更新后的遍历方向更新变量 ij 的值,以便进行下一次遍历。

最终,当结果列表 res 的长度达到原矩阵中所有元素的数量时,即完成了整个螺旋遍历过程,并返回结果列表。

时间复杂度:O(m*n)

空间复杂度:O(m*n)

基于上述思考,代码如下:

python 复制代码
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []
        i, j = 1, 1
        m = len(matrix)
        n = len(matrix[0])
        re_matrix = [['0'] * (n + 2) for _ in range(m + 2)]
        for x in range(1, m + 1):
            for y in range(1, n + 1):
                re_matrix[x][y] = matrix[x - 1][y - 1]
        res = []
        flag = 0
        while len(res) < m*n:
            res.append(re_matrix[i][j])
            re_matrix[i][j] = '0'

            if flag ==0 and re_matrix[i][j + 1] == '0':
                flag = 1
            if flag == 1 and re_matrix[i + 1][j] == '0':
                flag = 2
            if flag ==2 and re_matrix[i][j - 1] == '0':
                flag = 3
            if flag ==3 and re_matrix[i - 1][j] == '0':
                flag = 0

            if flag == 0:
                j += 1
            if flag == 1:
                i += 1
            if flag == 2:
                j -= 1
            if flag == 3:
                i -= 1
        return res

执行结果如下图:

相关推荐
可编程芯片开发38 分钟前
基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
算法
Sagittarius_A*1 小时前
后量子密码|通识认知 02|量子威胁核心原理:Shor 算法如何击穿传统公钥密码
算法·信息安全·密码学·量子计算
青山木1 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
其美杰布-富贵-李1 小时前
聚类算法详解:K-means、层次聚类与 DBSCAN
算法·机器学习·kmeans·聚类
乱七八糟的屋子2 小时前
MTL4 (Matrix Template Library) 超详细实战教程|C++高性能稠密/稀疏矩阵计算
c++·矩阵·稀疏矩阵·mtl4·matrixtemplate·c++线性代数·高性能数值计算
碧海银沙音频科技研究院2 小时前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
mifengxing2 小时前
LeetCode 238 除自身以外数组的乘积|无除法O(n)时间+O(1)空间双解法
java·算法·leetcode
依然鸣3 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
丢掉幻想准备斗争3 小时前
5.5树与二叉树的应用
算法
ZhouDevin3 小时前
算法论文/模型微调2——仅骨干1%~3% 参数达到与全量微调相当的性能
算法