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

难度参考

        难度:中等

        分类:数组

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

题目

        给定一个正整数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)

打卡

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API网关-Apisix RPM包方式自动化安装配置教程

文章目录 前言一、简介1. etcd简介2. APISIX简介3. apisix-dashboard简介 二、Apisix安装教程1. 复制脚本2. 增加执行权限3. 执行脚本4. 浏览器访问5. 卸载Apisix 三、命令1. Apisix命令1.1 启动apisix服务1.2 停止apisix服务1.3 优雅地停止apisix服务1.4 重启apisix服务1.5 重…

Android矩阵Matrix变换setRectToRect,Kotlin

Android矩阵Matrix变换setRectToRect&#xff0c;Kotlin 在 Android画布Canvas裁剪区域clipRect&#xff0c;Kotlin-CSDN博客 基础上&#xff0c;增加一个点&#xff0c;通过setRectToRect挖出Bitmap原图中心区域的一块放到目标RectF里面。 import android.content.Context imp…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

知识库建设这些工具来帮忙,企业工作效率翻倍

在当今深度信息化的年代&#xff0c;知识库成了企业不可或缺的一部分&#xff0c;它的建设与管理显得格外重要。然而&#xff0c;想要建设又好又高效的知识库并非易事。好消息是&#xff0c;有很多优秀的工具可以让这个过程变得更加轻松&#xff0c;今天我们就重点来探讨其中的…

excel中去掉单元格中两个数字之间的空格

excel中去掉单元格中两个数字之间的空格 使用公式&#xff1a;SUBSTITUTE(A1," “,”") 解释&#xff1a;将A1单元格中的空格查找出来并去掉。

搭建WebGL开发环境

前言 本篇文章介绍如何搭建WebGL开发环境 WebGL WebGL的技术规范继承自免费和开源的OpenGL ES标准&#xff0c;从某种意义上说&#xff0c;WebGL就是Web版的OpenGL ES&#xff0c;而OpenGL ES是从OpenGL中派生出来的。他们的应用环境有区别&#xff0c;一般来说&#xff1a;…

C++:第十四讲动态规划初步

每日C知识 想要在做C小游戏里实现等待效果&#xff0c;可以用Sleep。 Sleep函数可以使计算机程序&#xff08;进程&#xff0c;任务或线程&#xff09;进入休眠&#xff0c;使其在一段时间内处于非活动状态。 一般需要头文件windows.h。 注意"Sleep"首字母要大写…

ppt背景图片怎么设置?让你的演示更加出彩!

PowerPoint是一款广泛应用于演示文稿制作的软件&#xff0c;而背景图片是演示文稿中不可或缺的一部分。一个好的背景图片能够提升演示文稿的整体效果&#xff0c;使观众更加关注你的演示内容。可是ppt背景图片怎么设置呢&#xff1f;本文将介绍ppt背景图片设置的三个方法&#…

Spring-boot项目+Rancher6.3部署+Nacos配置中心+Rureka注册中心+Harbor镜像仓库+NFS存储

目录 一、项目概述二、环境三、部署流程3.1 Harbor部署3.1.1 docker安装3.1.2 docker-compose安装3.1.3 安装证书3.1.4 Harbor下载配置安装 3.2 NFS存储搭建3.3 Rancher平台配置3.3.1 NFS存储相关配置3.3.2 Harbor相关配置3.3.3 Nacos部署及相关配置3.3.4 工作负载deployment配…

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接&#xff08;基本和视频上一致&#xff09; ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方&#xff0c; 1&#xff0c;添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩

目录 引出缓存击穿缓存穿透缓存雪崩 总结 引出 谈谈redis的击穿、穿透、雪崩。 缓存击穿 缓存击穿&#xff1a;redis中没有&#xff0c;但是数据库有 顺序&#xff1a;先查缓存&#xff0c;判断缓存是否存在&#xff1b;如果缓存存在&#xff0c;直接返回数据&#xff1b;如果…

【前端素材】bootstrap3 实现地产置业公司source网页设计

一、需求分析 地产置业公司的网页通常是该公司的官方网站&#xff0c;旨在向访问者提供相关信息和服务。这些网页通常具有以下功能&#xff1a; 公司介绍&#xff1a;网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …

人工视觉仍然需要图像采集卡

最初&#xff0c;图像采集卡被用作模拟视频数字转换器和图像缓冲器&#xff0c;但如今它们能够执行复杂的任务&#xff0c;例如图像处理。图像采集卡的设计不断发展&#xff0c;旨在提高系统性能并减少计算机处理需求。 除了图像采集之外&#xff0c;图像采集卡还执行机器视觉…

芯片跨时钟域设计(二)

芯片培训(真实项目)介绍&#xff1a; 低功耗景芯SoC前端、中端、后端全流程实战培训(火爆订购中) DDR4/3项目实战培训 ARM Cortex-A72处理器12nm PR实战培训 ARM Cortex-A72处理器12nm DFT实战培训 ARM Cortex-A7处理器28nm PR实战培训(火爆价格战) RISC-V MCU 40nm全芯片…

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…

走进水稻种植教学基地可视化:科技与农业知识的完美结合

随着科技的不断发展&#xff0c;农业领域也在不断创新和进步。水稻种植教学基地可视化系统是一种基于现代信息技术手段的教学方式&#xff0c;通过虚拟现实、3D建模等技术&#xff0c;将水稻种植的全过程进行模拟和展示。这种教学方式打破了传统农业教学的局限性&#xff0c;使…

Springboot+vue的健身房管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的健身房管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的健身房管理系统&#xff0c;采用M&#xff08;model&#xf…

知识点积累系列(一)golang语言篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第一篇&#xff0c;记录golang语言相关的知识点 1.结构体的mapstructure是什么 mapstructure:"default" mapstructure是一个Go语言的库&#xff0c;用于将一个map中的值映射到…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态&#xff1a; channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…