LeetCode 54. 螺旋矩阵(C语言详解)——模拟 + 四边界收缩

一、题目描述

给你一个 m 行 n 列 的矩阵 matrix ,请按照 顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

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

示例 2:

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

提示:

复制代码
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

二、解题思路

这道题的核心思想是 模拟螺旋遍历过程

我们可以维护 四个边界

复制代码
top    上边界
bottom 下边界
left   左边界
right  右边界

每一轮按照 顺时针方向遍历四条边

复制代码
1. 左 → 右   (遍历 top 行)
2. 上 → 下   (遍历 right 列)
3. 右 → 左   (遍历 bottom 行)
4. 下 → 上   (遍历 left 列)

遍历完成后 收缩边界

复制代码
top++
right--
bottom--
left++

注意:

为了防止矩阵只有一行或一列导致 重复遍历,在执行第 3 和第 4 步时需要判断边界。

复制代码
if (top <= bottom)
if (left <= right)

三、遍历过程示例

矩阵:

复制代码
1 2 3
4 5 6
7 8 9

遍历顺序:

复制代码
第一轮:
1 → 2 → 3
        ↓
        6
        ↓
9 ← 8 ← 7
↑
4

第二轮:
5

最终结果:

复制代码
[1,2,3,6,9,8,7,4,5]

四、C语言代码实现

复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {

    int m = matrixSize;
    int n = matrixColSize[0];

    *returnSize = m * n;
    int* res = (int*)malloc(sizeof(int) * (*returnSize));

    int top = 0;
    int bottom = m - 1;
    int left = 0;
    int right = n - 1;

    int k = 0;

    while (top <= bottom && left <= right) {

        // 左 -> 右
        for (int i = left; i <= right; i++)
            res[k++] = matrix[top][i];
        top++;

        // 上 -> 下
        for (int i = top; i <= bottom; i++)
            res[k++] = matrix[i][right];
        right--;

        // 右 -> 左
        if (top <= bottom) {
            for (int i = right; i >= left; i--)
                res[k++] = matrix[bottom][i];
            bottom--;
        }

        // 下 -> 上
        if (left <= right) {
            for (int i = bottom; i >= top; i--)
                res[k++] = matrix[i][left];
            left++;
        }
    }

    return res;
}

五、复杂度分析

时间复杂度

复制代码
O(m × n)

每个元素只会被访问一次。

空间复杂度

复制代码
O(1)

除了返回数组外,没有额外空间。


六、总结

这道题本质是 矩阵模拟遍历问题 ,关键是掌握 四边界收缩模板

核心步骤:

复制代码
1. 左 -> 右
2. 上 -> 下
3. 右 -> 左
4. 下 -> 上

每一轮遍历后:

复制代码
top++
right--
bottom--
left++

并注意 边界判断

复制代码
if (top <= bottom)
if (left <= right)

这种 四边界模拟方法 是解决矩阵螺旋类问题的经典模板,在很多面试题中都会出现。


相关推荐
小钻风336617 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李17 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
qizayaoshuap18 小时前
# ❌ 井字棋 — 鸿蒙ArkTS Minimax AI算法与博弈系统设计
人工智能·算法·华为·harmonyos
皓月斯语19 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
atunet19 小时前
树状结构在查询优化中的作用与实现细节7
算法
前端双越老师19 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈
dear_bi_MyOnly19 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
做个文艺程序员19 小时前
Linux第22篇:用Docker容器化你的Java SaaS应用:一次构建,随处运行
java·docker·容器
徐凤年_19 小时前
rog_map参数理解
算法
春日见19 小时前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表