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)

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


相关推荐
ruleslol4 分钟前
System Prompt(系统提示词) 的用法
java·ai
All for pursuit.7 分钟前
【矩阵-2】240.搜索二维矩阵 II
数据结构·c++·算法·leetcode
user_admin_god8 分钟前
第 03 篇:Java HttpClient 手写第一个 Chat 请求
java·人工智能·spring boot·语言模型
程序猿阿森13 分钟前
C语言预处理完全指南:宏定义、条件编译与头文件规范,一篇搞懂工程化编程
c语言·c++·编译
西峰u16 分钟前
Java多线程从入门到线程安全
java·开发语言·jvm
6Hzlia23 分钟前
【Classic 150 刷题计划】 LeetCode 209. 长度最小的子数组 | C++ 滑动窗口(毛毛虫算法)经典模板
c++·算法·leetcode
gis开发之家35 分钟前
Spring Boot 4 定时任务与异步线程池:从 @Scheduled 到高并发任务编排(生产级实战)
java·spring boot·后端·wpf·spring boot4
6Hzlia38 分钟前
【Classic 150 刷题计划】 LeetCode 28. 找出字符串中第一个匹配项的下标 | C++ 滑动窗口与子串比对
c++·算法·leetcode
郑州光合科技余经理2 小时前
本地生活系统:多业务订单字段怎么分账本导出
java·开发语言·前端·数据库·uni-app·php·ai编程
YangYang9YangYan3 小时前
2026 校招审计风控岗位 JD 拆解,工具、专业能力与面试考点
java·大数据·人工智能·数据分析