算法训练营第四天|59. 螺旋矩阵 II
一、今日学习的文章链接和视频链接
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
二、自己看到题目的第一想法
看到题目要求生成n×n的螺旋矩阵,第一反应是模拟顺时针填充的路径。因为矩阵是正方形且元素从1到n²连续排列,核心思路是维护四个边界(上、下、左、右),按 “左→右→下→左→上” 的顺序循环填充数值,每填充完一圈就收缩边界,直到填满所有元素。这种模拟法逻辑直观,能精准控制螺旋走向,是这类题的经典解法。
三、自己实现过程中遇到哪些困难
- 边界控制与循环冲突:
- 最初未给循环添加
num<=n*n的校验,当n为奇数(如n=3)时,中心元素会因边界交叉导致重复填充或越界,出现脏数据。 - 边界收缩的时机容易写错,比如未先收缩就开始填充,导致元素覆盖或错位。
- 最初未给循环添加
- 内存初始化问题:
- 直接使用
malloc分配二维数组,未初始化导致出现随机乱码值(如之前遇到的-1094795586),这是C语言动态数组的常见坑点。
- 直接使用
- 循环逻辑混淆:
- 四个方向的遍历范围容易写错(比如下边界填充时未从top开始),导致螺旋顺序混乱,矩阵形状不符合要求。
四、代码实现与测试结果
代码实现
测试结果
五、今日收获心得
通过这道题,我彻底掌握了模拟法在矩阵类题目中的应用,以及边界收缩的核心思想。深刻意识到算法题不仅要实现逻辑,更要严谨处理细节:
- 必须重视C语言的内存管理,用
calloc替代malloc初始化内存,从根源避免脏数据。 - 边界控制是核心,每一步填充都要明确范围,且必须加上
num<=n*n的兜底条件,确保奇数边长矩阵的中心元素能正确填充。 - 螺旋填充的核心逻辑(四方向循环+边界收缩)具有通用性,后续遇到类似螺旋遍历、分层填充的题目,都能沿用这套思路。这次解题也让我养成了先分析边界、再严谨编码的习惯,提升了代码的健壮性。
