力扣第 54 题 **螺旋矩阵**

news/2024/11/17 1:59:58/

力扣第 54 题是 螺旋矩阵(Spiral Matrix)。题目要求按螺旋顺序遍历一个 m x n矩阵,并返回遍历的结果。

解题思路

螺旋矩阵的遍历顺序是 从左到右,然后 从上到下,接着 从右到左,最后 从下到上,依次循环,直到遍历完所有元素。可以通过定义边界条件来控制这些遍历方向:

  1. 定义四个边界:上边界 top、下边界 bottom、左边界 left 和右边界 right
  2. 按照顺序进行遍历:
    • 从左到右遍历顶行。
    • 从上到下遍历最右列。
    • 从右到左遍历底行(若 top <= bottom)。
    • 从下到上遍历最左列(若 left <= right)。
  3. 每完成一行或一列的遍历后,更新相应的边界。
  4. 重复上述步骤,直到 top > bottomleft > right,即所有元素都被访问。

C 语言实现

#include <stdio.h>
#include <stdlib.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {if (matrixSize == 0 || matrixColSize[0] == 0) {*returnSize = 0;return NULL;}int top = 0, bottom = matrixSize - 1;int left = 0, right = matrixColSize[0] - 1;int total = matrixSize * matrixColSize[0];int* result = (int*)malloc(total * sizeof(int));*returnSize = 0;while (top <= bottom && left <= right) {// 从左到右遍历顶行for (int i = left; i <= right; i++) {result[(*returnSize)++] = matrix[top][i];}top++;  // 顶行向下收缩// 从上到下遍历最右列for (int i = top; i <= bottom; i++) {result[(*returnSize)++] = matrix[i][right];}right--;  // 右列向左收缩// 从右到左遍历底行(确保尚未遍历过)if (top <= bottom) {for (int i = right; i >= left; i--) {result[(*returnSize)++] = matrix[bottom][i];}bottom--;  // 底行向上收缩}// 从下到上遍历最左列(确保尚未遍历过)if (left <= right) {for (int i = bottom; i >= top; i--) {result[(*returnSize)++] = matrix[i][left];}left++;  // 左列向右收缩}}return result;
}int main() {int rows = 3, cols = 3;int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int* matrix[3];for (int i = 0; i < rows; i++) {matrix[i] = data[i];}int matrixColSize[] = {3, 3, 3};int returnSize;int* result = spiralOrder(matrix, rows, matrixColSize, &returnSize);printf("螺旋顺序遍历结果: ");for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");free(result);return 0;
}

逐步解释代码

  1. 边界初始化:定义上、下、左、右边界,分别为 top = 0bottom = matrixSize - 1left = 0right = matrixColSize[0] - 1

  2. 循环遍历

    • 从左到右:遍历顶行,从 leftright,然后将 top 加 1。
    • 从上到下:遍历最右列,从 topbottom,然后将 right 减 1。
    • 从右到左(若 top <= bottom):遍历底行,从 rightleft,然后将 bottom 减 1。
    • 从下到上(若 left <= right):遍历最左列,从 bottomtop,然后将 left 加 1。
  3. 返回结果:将所有遍历结果存入 result 数组,最终返回螺旋遍历结果。

复杂度分析

  • 时间复杂度 O ( m ∗ n ) O(m * n) O(mn)mn矩阵的行数和列数。每个元素被访问一次。
  • 空间复杂度 O ( m ∗ n ) O(m * n) O(mn),存储螺旋顺序的结果数组需要 O ( m ∗ n ) O(m * n) O(mn)的空间。

http://www.ppmy.cn/news/1547589.html

相关文章

AWS CLI

一、介绍 1、简介 aws configure 是 AWS 提供的一个命令行工具&#xff0c;用于快速配置 AWS CLI&#xff08;命令行界面&#xff09;和 AWS SDK&#xff08;软件开发工具包&#xff09;中使用的凭证、默认区域以及输出格式。这个命令是 AWS CLI 中的一个配置工具&#xff0c…

Mac解压包安装MongoDB8并设置launchd自启动

记录一下在mac上安装mongodb8过程&#xff0c;本机是M3芯片所以下载m芯片的安装包&#xff0c;intel芯片的类似操作。 首先下载安装程序包。 # M芯片下载地址 https://fastdl.mongodb.org/osx/mongodb-macos-arm64-8.0.3.tgz # intel芯片下载地址 https://fastdl.mongodb.org…

子网划分学习

举例 10.0.1.0/30&#xff0c;这个给的就是网络地址&#xff0c;那么意思就是网络地址就是一个网段 可以得到网络地址&#xff0c;主机地址&#xff0c;广播地址 这个就是一个网段&#xff0c;但是他有多少的子网呢&#xff0c;该怎么算呢&#xff0c;首先根据子网掩码&…

Spring Boot框架在电商领域的应用

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#…

Pytorch学习--神经网络--完整的模型验证套路

一、选取的图片 全部代码依托于该博客 二、代码&#xff08;调用训练好的模型&#xff09; import torch import torchvision from PIL import Image from model import *img_path "dog.png" image Image.open(img_path)print(image.size)transform torchvisi…

wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 wflow-web是一个开源的工作流设计器&#xff0c;它支持可视化拖拽表单组件&#xff0c;动态任意层级结构审批节点&#xff0c;以及复杂流程条件的设置…

全面评估ASPICE标准对汽车软件开发的影响与效果

在评估ASPICE&#xff08;Automotive SPICE&#xff09;标准的效果时&#xff0c;可以从多个维度进行考量&#xff0c;以确保全面且准确地反映该标准对汽车软件和嵌入式系统开发过程的积极影响。以下是一些关键的评估方面&#xff1a; 1. 过程改进与标准化 标准化程度&#xf…

深度学习神经网络在机器人领域应用的深度剖析:原理、实践与前沿探索

深度学习神经网络在机器人领域的应用非常广泛&#xff0c;以下是详细介绍&#xff1a; 主要应用方向 环境感知与识别&#xff1a; 物体识别与分类&#xff1a;机器人利用深度学习神经网络能够准确识别周围环境中的各种物体&#xff0c;比如区分不同形状、颜色、材质的物品&…