Featured image of post spiralMatrix

spiralMatrix

54. 螺旋矩阵

分析

  1. 初始化变量:
    • 使用 count 记录已访问的元素个数,初始为 0
    • 将已访问的元素标记为 INF,以避免重复访问
    • 初始化起始位置为 (x, y) = (0, -1)
  2. 按顺时针方向遍历:
    • 按照 右、下、左、上 的顺序依次遍历矩阵
    • 检查下一步是否越界或访问到标记值,如果满足条件则改变方向
  3. 收集结果:
    • 在每次遍历过程中,将当前值加入结果数组 res
  4. 返回结果:
    • 当遍历的元素数量 count 等于矩阵元素总数时,返回结果

时间复杂度

需要遍历矩阵中的所有元素,总时间复杂度 O(n * m)

空间复杂度

在矩阵内原地标记访问过的元素,无需额外空间,空间复杂度为 O(1)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Solution
{
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix)
    {
        int n = matrix.size();    // 矩阵行数
        int m = matrix[0].size(); // 矩阵列数

        int count = 0; // 记录访问过的元素数量
        int INF = 0x3f3f3f3f; // 标记值,用于标记已访问的元素
        std::vector<int> res; // 存放结果的数组

        int x = 0, y = -1; // 起始位置在矩阵外部
        while (count < n * m)
        {
            // 向右遍历
            while (y + 1 < m && matrix[x][y + 1] != INF)
            {
                res.push_back(matrix[x][y + 1]); // 记录元素
                matrix[x][y + 1] = INF;         // 标记为已访问
                ++ y;                            // 移动列
                ++ count;                        // 更新已访问数量
            }

            // 向下遍历
            while (x + 1 < n && matrix[x + 1][y] != INF)
            {
                res.push_back(matrix[x + 1][y]);
                matrix[x + 1][y] = INF;
                ++ x;
                ++ count;
            }

            // 向左遍历
            while (y - 1 >= 0 && matrix[x][y - 1] != INF)
            {
                res.push_back(matrix[x][y - 1]);
                matrix[x][y - 1] = INF;
                -- y;
                ++ count;
            }

            // 向上遍历
            while (x - 1 >= 0 && matrix[x - 1][y] != INF)
            {
                res.push_back(matrix[x - 1][y]);
                matrix[x - 1][y] = INF;
                -- x;
                ++ count;
            }
        }
        return res;
    }
};
Built with Hugo
Theme Stack designed by Jimmy