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)

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


相关推荐
NE_STOP4 小时前
Vide Coding--AI编程工具的选择
java
LDR0064 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
通信小呆呆4 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
Bobolink_5 小时前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
码云数智-园园5 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆5 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
benben0445 小时前
强化学习之DQN算法族(基于gymnasium开发)
算法
小宇宙Zz5 小时前
Maven依赖冲突
java·服务器·maven
swordbob5 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio