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

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

难度参考

        难度:中等

        分类:数组

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

题目

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

打卡

相关文章:

  • 51单片机智能小车
  • 电脑卡住不动了怎么办?这些方法你知道吗
  • CSS transition(过渡效果)详解
  • MySQL 函数参考手册(MySQL 字符串函数)
  • Unity3D正则表达式的使用
  • 语言革命:NLP与GPT-3.5如何改变我们的世界
  • collection、ofType、select的联合用法(Mybatis实现树状结构查询)
  • 【极数系列】Flink环境搭建Linux版本 (03)
  • linux 云主机扩展磁盘的步骤
  • win11 蓝屏分析,没有一定的原因,没有解决办法,只能不断尝试
  • 常用命令-
  • 内置函数和推导式
  • 83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据
  • FPGA硬件架构
  • 第26讲:顺序表的应用(通讯录)
  • canvas 绘制双线技巧
  • co.js - 让异步代码同步化
  • css选择器
  • Effective Java 笔记(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • Hibernate【inverse和cascade属性】知识要点
  • JS 面试题总结
  • maya建模与骨骼动画快速实现人工鱼
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SwizzleMethod 黑魔法
  • vue数据传递--我有特殊的实现技巧
  • 理解在java “”i=i++;”所发生的事情
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 智能合约开发环境搭建及Hello World合约
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 正则表达式-基础知识Review
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)(1.11) SiK Radio v2(一)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (四)汇编语言——简单程序
  • (转)linux下的时间函数使用
  • .net core使用ef 6
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net的DataSet直接与SQL2005交互
  • .NET构架之我见
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20161214]如何确定dbid.txt
  • [383] 赎金信 js
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C++]拼图游戏
  • [ccc3.0][数字钥匙] UWB配置和使用(二)
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [DevOps云实践] 彻底删除AWS云资源
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?