算法练习-螺旋矩阵(思路+流程图+代码)

难度参考

        难度:中等

        分类:数组

        难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。

题目

        给定一个正整数n,生成一个包含1到 n^2 所有元素,且元素按【顺时针】顺序螺旋排列的正方形矩阵。
示例1:
        输入:n=3
        输出:[[1,2,3],[8,9,4],[7,6,5]]

思路

        题目要求生成一个顺时针螺旋排列的正方形矩阵,矩阵元素从1到n^2逐个递增。

  1. 初始化矩阵: 创建一个大小为n×n的矩阵,初始化所有元素为0。

  2. 定义边界: 使用四个变量topbottomleftright表示当前螺旋的边界。

  3. 顺时针填充矩阵: 使用循环,按照从左到右、从上到下、从右到左、从下到上的顺序填充矩阵。

  4. 更新边界: 每填充完一个方向后,更新相应的边界,确保下一轮填充在新的边界内进行。

  5. 重复步骤3和4: 循环执行步骤3和4,直到矩阵填充完成。

示例

        考虑n=3的情况,即生成一个3×3的螺旋矩阵。

        1.初始化矩阵:matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]],

matrix = [
  [0, 0, 0],
  [0, 0, 0],
  [0, 0, 0]
]

        初始边界:top=0, bottom=2, left=0, right=2。

        2.从左到右:matrix[0][0]=1, matrix[0][1]=2, matrix[0][2]=3

matrix = [
  [1, 2, 3],
  [0, 0, 0],
  [0, 0, 0]
]

        更新top=1,

        此时,top=1, bottom=2, left=0, right=2。

        3.从上到下:matrix[1][2]=6, matrix[2][2]=9

matrix = [
  [1, 2, 3],
  [0, 0, 4],
  [0, 0, 5]
]

        更新right=1,

        此时,top=1, bottom=2, left=0, right=1。

        4.从右到左:matrix[2][1]=8, matrix[2][0]=7

matrix = [
  [1, 2, 3],
  [0, 0, 4],
  [7, 6, 5]
]

        更新bottom=1,

        此时,top=1, bottom=1, left=0, right=1。

        5.从下到上:matrix[1][0]=4

matrix = [
  [1, 2, 3],
  [8, 9, 4],
  [7, 6, 5]
]

        更新left=1,

        此时,top=1, bottom=1, left=1, right=1。

        在每个方向上填充完后,我们更新相应的边界,并按照新的边界进行下一个方向的填充。这样,直到矩阵被填充完成。

梳理

        本题主要逻辑是生成一个顺时针螺旋矩阵,其本质是通过模拟顺时针填充矩阵的过程。

  1. 初始化矩阵和边界指针:

    • 创建一个大小为 n x n 的矩阵,所有元素初始化为0。
    • 初始化四个指针 topbottomleftright 分别表示矩阵的上、下、左、右边界。
    • 初始化 num 用于填充矩阵的数字。
  2. 循环填充矩阵:

    • 在满足循环条件的情况下,按照顺时针的顺序从左到右、从上到下、从右到左、从下到上依次填充矩阵。
    • 在每个方向上,通过循环将 num 递增并填充到相应的位置。
  3. 逐步调整边界指针:

    • 每填充完一个方向后,逐步调整边界指针,确保下一次填充的方向不会重叠。
  4. 返回生成的矩阵:

    • 循环结束后,生成的矩阵即为顺时针螺旋矩阵。

        本质上,这段代码通过模拟顺时针填充矩阵的过程,利用循环和边界指针的调整,逐步生成顺时针螺旋矩阵。这是一种常见的矩阵操作,通过巧妙的控制循环和边界指针,实现了一个相对简洁而高效的算法。

代码

#include <iostream>
#include <vector>

using namespace std;

// 生成顺时针螺旋矩阵
vector<vector<int>> generateMatrix(int n) {
    // 初始化矩阵
    vector<vector<int>> matrix(n, vector<int>(n, 0));

    // 设置边界指针
    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    int num = 1; // 用于填充矩阵的数字

    // 循环填充矩阵
    while (top <= bottom && left <= right) {
        // 从左到右
        for (int i = left; i <= right; ++i) {
            matrix[top][i] = num++;
        }
        top++;

        // 从上到下
        for (int i = top; i <= bottom; ++i) {
            matrix[i][right] = num++;
        }
        right--;

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

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

    return matrix;
}

// 辅助函数:打印矩阵
void printMatrix(const vector<vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int num : row) {
            cout << num << " ";
        }
        cout << endl;
    }
}

int main() {
    int n = 3;
    
    // 生成螺旋矩阵
    vector<vector<int>> result = generateMatrix(n);

    cout << "生成的螺旋矩阵:" << endl;
    
    // 打印矩阵
    printMatrix(result);

    return 0;
}

        时间复杂度:O(n^2)模拟过程相当于遍历了一遍二维矩阵。
        空间复杂度:O(1)

打卡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/345223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BACnet网关BL121BN 实现稳定可靠、低成本、简单的楼宇自控协议BACnet转OPC UA解决方案

随着楼宇自控系统的迅猛发展&#xff0c;人们深刻认识到在楼宇暖通行业中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术…

【数据结构】 循环队列的基本操作 (C语言版)

目录 一、顺序队列 1、顺序队列的定义&#xff1a; 2、顺序队列的优缺点&#xff1a; 二、循环队列 1、循环队列的定义&#xff1a; 2、循环队列的优缺点&#xff1a; 三、循环队列的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、循环队…

PPO学习

openai用tf实现的真的看不懂&#xff0c;大佬的世界… PPO的详细细节 1. 奖励模型和策略的价值头将 query 和 response 的连接作为输入 奖励模型和策略的价值头 不 仅仅查看响应。相反&#xff0c;它将 query 和 response 连接在一起&#xff0c;作为 query_response def ge…

如何群发邮件outlook?外贸邮件群发教程?

outlook怎么设置邮件群发&#xff1f;outlook邮箱群发邮件方法&#xff1f; 在日常生活中&#xff0c;我们经常需要给多个人发送相同的邮件。这时候&#xff0c;群发邮件就显得尤为重要。Outlook作为一款常用的办公软件&#xff0c;提供了强大的邮件群发功能。蜂邮EDM就教大家…

Linux 文件:IO接口详解及实操

一、C语言中的文件IO读写操作 在c语言文件中&#xff0c;创建、打开、读、写操作可以通过如下的代码进行&#xff1a; 1.1写文件 通过w指令对文件进行写入操作时&#xff0c;编译器会先将文件内容清空然后重新写入。 #include <stdio.h> #include <string.h> i…

前端上传大文件使用分片上传

前提:分片上传针对于一些大的文件、普通大小的文件使用element中的上传组件可以实现效果,例如几G的文件就会比较卡,所以这时候就需要用到分片上传~ 前端及后端分片上传笔记 效果:(上传进度展示) 效果:(上传成功的效果展示) 1、 新建一个上传组件 2、使用vue-simple-…

ATF(TF-A)安全通告TF-V11——恶意的SDEI SMC可能导致越界内存读取(CVE-2023-49100)

目录 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) 二、透过事务看本质SDEI是干啥的呢&#xff1f; 三、CVE-2023-49100 1、GICv2 systems 2、GICv3 systems 四、漏洞修复 一、ATF(TF-A)安全通告TFV-11 (CVE-2023-49100) Title 恶意的SDEI SMC可能导致越界内存读取&am…

java数据结构与算法刷题-----LeetCode667. 优美的排列 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 题目要求我们返回一个数组长度为n的数组&#xff0c;必须含有1~n…

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

详解一次一密

目录 一. 介绍 二. 一次一密方案 三. 正确性分析 四. 证明一次一密方案是完美安全 五. 一次一密的应用 六. 小结 一. 介绍 一次一密&#xff0c;英语写做one time pad。 在1917年&#xff0c;Vernam提出了一个完美安全的加密方案&#xff0c;后世将其称之为一次一密。在…

Element中的el-input-number+SpringBoot+mysql

1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id&#xff1a;"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…

选择国产压测工具应注意什么?

随着互联网和信息技术的飞速发展&#xff0c;压力测试成为了确保软件系统稳定性和性能的不可或缺的环节。在压测工具的选择上&#xff0c;近年来国产压测工具逐渐崭露头角&#xff0c;但在使用时仍需谨慎。本文将探讨在选择国产压测工具时需要注意的关键因素。 功能完备性&…

离线编译 onnxruntime-with-tensortRT

记录为centos7的4090开发机离线编译onnxruntime的过程&#xff0c;因为在离线的环境&#xff0c;所以踩了很多坑。 https://onnxruntime.ai/docs/execution-providers/TensorRT-ExecutionProvider.html 这里根据官网的推荐安装1.15 版本的onnx 因为离线环境&#xff0c;所以很…

中国大模型迎来“95后” 百度奖学金发掘百位“未来AI技术领袖”

在人工智能掀起的科技革命和产业变革浪潮下&#xff0c;大模型成为最受关注的研究领域。1月22日&#xff0c;第十一届百度奖学金颁奖典礼在北京举行&#xff0c;来自全球顶尖高校及科研机构的10位“未来AI技术领袖”脱颖而出&#xff0c;他们平均年龄仅27岁&#xff0c;其中8人…

关于Redis的最常见的十道面试题-分布式锁和布隆过滤器

面试题一&#xff1a;有序集合在日常工作中的使用场景有哪些&#xff1f; 有序集合在工作中的应用场景有很多&#xff0c;例如“ 排行榜&#xff1a;可以将用户的得分作为有序集合的分支&#xff0c;用户的ID作为成员&#xff0c;通过有序集合的排名功能可以得到用户的排名信…

OpenCV第 2 课 OpenCV 环境搭建

文章目录 第 2 课 OpenCV 环境搭建1.安装 Numpy2.从 Ubuntu 存储库安装 OpenCV3.验证 OpenCV 安装 第 2 课 OpenCV 环境搭建 1.安装 Numpy 每一张图像都有很多个像素点&#xff0c;这也导致了程序中会涉及大量的数组处理。Numpy 是一个 Python 的拓展库&#xff0c;它对多维数…

MySQL怎么根据当前时间获取连续十二个月统计数据

需求 在某些业务场景中&#xff0c;需要后台获取连续十二个月的统计数据&#xff0c;如下图&#xff1a; 解决方式 1、创建一张临时表&#xff0c;在表中插入序号数据 该表的最大数量决定统计返回的最大条数 CREATE TABLE sys_redundancy (id bigint(22) NOT NULL AUTO_I…

YOLOv7调用摄像头检测报错解决

yolov7detect.py文件调用本地摄像头&#xff0c;把source参数设为0 parser.add_argument(--source, typestr, default0, helpsource) # file/folder, 0 for webcam 报错&#xff1a;cv2.error: OpenCV(3.4.2) 一堆地址:The function is not implemented. Rebuild the library…

【数据分析】matplotlib、numpy、pandas速通

教程链接&#xff1a;【python教程】数据分析——numpy、pandas、matplotlib 资料&#xff1a;https://github.com/TheisTrue/DataAnalysis 1 matplotlib 官网链接&#xff1a;可查询各种图的使用及代码 对比常用统计图 1.1 折线图 &#xff08;1&#xff09;引入 from …

时间序列大模型:TimeGPT

论文&#xff1a;https://arxiv.org/pdf/2310.03589.pdf TimeGPT&#xff0c;这是第一个用于时间序列的基础模型&#xff0c;能够为训练期间未见过的多样化数据集生成准确的预测。 大规模时间序列模型通过利用当代深度学习进步的能力&#xff0c;使精确预测和减少不确定性成为…