螺旋矩阵与螺旋队列
1|0螺旋矩阵
1|1方形矩阵
问题描述
给定一个的方阵,其中元素为自然数,排列规则为按照顺时针螺旋方向单调递增(起始值为,终点值为)。举例如下:
若n = 3,螺旋矩阵为:
若n = 4,螺旋矩阵为:
若n = 5,螺旋矩阵为:
输入:
输出:螺旋矩阵
解题思路
最简单直接的想法就是按照规则先申请好的矩阵内存,然后按螺旋方向依次填入相应的元素,填充完毕后再双层循环打印出来。时间按复杂为O(n2),空间复杂度也为O(n2)。 Leetcode 59
按照矩阵规律填充元素时,我们是随机访问矩阵元素的(如果可以按顺序访问,根本不用先存起来再打印)。随机访问内存,效率当然不高。所以即使时间复杂度已为最优,但那只是理论上的最优,在实践中表现并不一定就好。
假如能根据行列号直接计算出对应的矩阵元素就好了。当给定后,这个矩阵就已经唯一确定了,那么每一个元素也是确定的。也就是说,每一个位置放什么元素仅仅取决于。因此我们可以找到一个函数$element(i, j)ij$映射成对应这个行列号的元素。当然这个函数肯定不是一个简单的函数,不是一眼就可以看出来的,但也并不是不可能。
现在我们就来考查一下这个矩阵有什么特点。注意观察一下螺旋矩阵的最外层,它的左上角的元素是最小的,然后沿顺时针方向递增,就如同一个环一样(比如为4时,就是最外面一层环)。再往里面一层,也是一样,顺时针方向递增的一个环(比如为时,就是里面一层环)。以此类推,环里面还有一层环(为时有层环,为时有层环,最里面一层只有一个元素),实际上是一个圆环套圆环结构。每一圆环最关键的元素就是左上角的那一个元素。只要知道了这个元素,再加上这个正方形环的边长就可以计算出剩下的元素。设左上角元素为,边长为,以左上角为原(行号和列号均为0),其它元素的行号和列号都以它作参考,则的计算方法如下所示:
1. 若,;
2. 否则若,;
3. 否则若,;
4. 否则;
详细的函数计算步骤见如下代码:
1|2一般矩阵NxM
打印一般矩阵与方阵的思路基本一致,以上代码稍微改动即可。下面讲讲其它常见的题型。
问题描述
输入:行列矩阵;
输出:顺时针螺旋序列;
解题思路
双百答案直接采用画圈思维,确定上下左右四个边界,画一条边就更新对应的边界,并做判断(是否画完)。
代码实现(C)
【注意】这题有个坑!刚开始要检查输入数组是否为空(matrixSize == 0),不然一提交就会报错数组越界。
Leetcode 885
问题描述
在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始
这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。
现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。
每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。
最终,我们到过网格的所有 R * C 个空间。
按照访问顺序返回表示网格位置的坐标列表。
C语言渣题解
2|0螺旋队列
螺旋队列长这样:
不难发现他的排列规律主要有两点:
- 顺时针螺旋,自然数递增
- 右斜上对角线数字(紫色)为奇数平方向上递增,且值与所在圈数有关
2|1问题描述
设1的坐标是(0,0),x方向向右为正,y方向向下为正,如图所示:
例如,7的坐标为(-1,-1),2的坐标为(1,0)。编程实现输入任意一点坐标(x,y),输出所对应的数字。
2|2解题思路
与螺旋矩阵类似的核心思路:画圈=>找到每一圈的基准点=>四条边上的元素相对于起始点的位置关系推出值的关系。
具体说来,设圈数从开始编号。则有
- 不难看出紫色元素为所在圈最大值,将它最为本圈的基准点(坐标为)。紫色元素取值为,与圈数编号的关系:。本圈(方形)边长为,则易得本圈最小值即它的正下方元素。
- 得到基准点元素值后,四条边的元素值对应坐标的关系就很容易得到了:
上边:;
左边:;
下边:;
右边:;
代码实现
【注意】
- 输出的矩阵坐标和题目给定的平面直角坐标系不同,两者相当于行列互换了!
- %-5d控制输出对齐,fflush(stdout)清空缓冲区,保证第一个输出在输入之前显示。
参考资料:
https://blog.csdn.net/songzitea/article/details/8348243
https://blog.csdn.net/Chen_Swan/article/details/105799956
https://www.it610.com/article/1543831.htm
它的正下方一位为本圈最小值。
__EOF__

本文链接:https://www.cnblogs.com/MinPage/p/13942418.html
关于博主:Information is everything
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了