当前位置: 首页 > article >正文

力扣第 54 题: 螺旋矩阵

题目描述

力扣第 54 题 —— 螺旋矩阵,要求从矩阵的左上角开始,按顺时针方向逐层遍历矩阵中的所有元素,并以一维数组的形式返回结果。

解题思路

这道题可以用模拟法解决,通过维护矩阵的边界(上下左右四个方向)来实现螺旋顺序的输出。


代码实现与逐行详解

int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {
  1. 函数签名:返回一维数组形式的螺旋矩阵结果。
    • matrix: 输入矩阵,二维数组。
    • matrixSize: 矩阵的行数。
    • matrixColSize: 矩阵每行的列数数组。
    • returnSize: 返回数组的大小。
    if (matrixSize == 0 || matrixColSize[0] == 0) {
        *returnSize = 0;
        return NULL;
    }
  1. 边界判断:如果矩阵为空,直接返回 NULL
    *returnSize = matrixSize * matrixColSize[0];
    int* result = (int*)malloc(sizeof(int) * (*returnSize));
    if (!result) {
        return NULL;  // 内存分配失败
    }
  1. 初始化结果数组:根据矩阵总元素数量分配动态内存。
    int left = 0, right = matrixColSize[0] - 1, top = 0, bottom = matrixSize - 1;
    int index = 0;
  1. 定义边界变量 leftrighttopbottom,以及当前输出位置的索引 index

螺旋遍历逻辑
    while (index < *returnSize) {
  1. 通过 while 循环逐步缩小矩阵边界,输出所有元素。

  • 从左到右遍历
        for (int i = left; i <= right && index < *returnSize; i++) {
            result[index++] = matrix[top][i];
        }
        top++;
  1. 从左到右遍历当前 top 行,将该行的元素加入结果,并向下收缩 top 边界。

  • 从上到下遍历
        for (int i = top; i <= bottom && index < *returnSize; i++) {
            result[index++] = matrix[i][right];
        }
        right--;
  1. 从上到下遍历当前 right 列,加入结果,并向左收缩 right 边界。

  • 从右到左遍历
        for (int i = right; i >= left && index < *returnSize; i--) {
            result[index++] = matrix[bottom][i];
        }
        bottom--;
  1. 从右到左遍历当前 bottom 行,加入结果,并向上收缩 bottom 边界。

  • 从下到上遍历
        for (int i = bottom; i >= top && index < *returnSize; i--) {
            result[index++] = matrix[i][left];
        }
        left++;
  1. 从下到上遍历当前 left 列,加入结果,并向右收缩 left 边界。

返回结果
    return result;
}
  1. 最终返回结果数组。

主函数测试

int main() {
    // ...(省略,见完
    整代码部分)
}

测试用例中定义了一个 3 × 4 3 \times 4 3×4 的矩阵,程序会输出其螺旋顺序:1 2 3 4 8 12 11 10 9 5 6 7


复杂度分析

  • 时间复杂度 O ( m ⋅ n ) O(m \cdot n) O(mn),其中 m m m 是矩阵行数, n n n 是矩阵列数。每个元素被遍历一次。
  • 空间复杂度 O ( m ⋅ n ) O(m \cdot n) O(mn),用于存储结果数组。

输出结果

螺旋矩阵输出结果:
1 2 3 4 8 12 11 10 9 5 6 7

http://www.kler.cn/a/507276.html

相关文章:

  • Mongodb相关内容
  • 归子莫的科技周刊#2:白天搬砖,夜里读诗
  • 《小迪安全》学习笔记05
  • ubuntu下安装编译cmake,grpc与protobuf
  • 【cs.CV】25.1.15 arxiv更新速递
  • 一次完整的tcpdump -XX输出报文详解
  • Js:正则表达式及其方法
  • 基于单片机的语音控制玩具汽车的设计
  • UE5 gas制作平A,冷却,打击伤害
  • Fabric区块链网络搭建:保姆级图文详解
  • C#在Json序列化时将key和value转为对应的中文
  • jmeter事务控制器-勾选Generate Parent Sample
  • 基于单片机的智能计步器电路设计
  • Flink Standalone 方案中解决挂机问题
  • 树莓派5--系统问题汇总
  • Qt 线程常用通信方式
  • 【LeetCode】每日一题 2024_1_14 超过阈值的最少操作数 I(简单模拟)
  • 安全测评主要标准
  • java实现树形递归
  • flutter在使用gradle时的加速
  • python中数据可视化库(Matplotlib)
  • PCL 获取指定区域的点【2025最新版】
  • 万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用
  • 如何使用Ultralytics训练自己的yolo5 yolo8 yolo10 yolo11等目标检测模型
  • 强化学习-蒙特卡洛方法
  • 数据库基础实验1(创建表,设置外键,检查,不为空,主键等约束)安装mysql详细步骤