
1. 螺旋矩阵II问题解析最近在力扣刷题时遇到了经典的螺旋矩阵II问题编号59这道题看似简单但实现起来有不少细节需要注意。题目要求给定一个正整数n生成一个包含1到n²所有元素的n×n正方形矩阵且这些元素按照顺时针螺旋顺序排列。作为C选手我花了些时间研究这个问题发现核心在于控制好边界条件和遍历方向。下面分享我的解题思路和实现过程希望能帮助同样在刷题的朋友们少走弯路。2. 解题思路分析2.1 问题分解螺旋矩阵的生成可以分解为四个方向的循环填充从左到右填充上行从上到下填充右列从右到左填充下行从下到上填充左列每个循环完成后对应的边界会向内收缩一层。这个过程需要持续到所有元素填充完毕。2.2 边界条件处理关键是要处理好四个边界左边界(left)右边界(right)上边界(top)下边界(bottom)每次完成一个方向的填充后对应的边界需要调整。例如完成从左到右的填充后上边界top需要加1。3. C实现详解3.1 初始化矩阵首先需要初始化一个n×n的二维vectorvectorvectorint generateMatrix(int n) { vectorvectorint matrix(n, vectorint(n)); // 后续代码... }3.2 主循环实现使用while循环控制整体流程直到填充完所有数字int num 1; int left 0, right n - 1; int top 0, bottom n - 1; while (left right top bottom) { // 四个方向的填充代码... }3.3 四个方向填充细节3.3.1 从左到右填充上行for (int i left; i right; i) { matrix[top][i] num; } top;3.3.2 从上到下填充右列for (int i top; i bottom; i) { matrix[i][right] num; } right--;3.3.3 从右到左填充下行for (int i right; i left; i--) { matrix[bottom][i] num; } bottom--;3.3.4 从下到上填充左列for (int i bottom; i top; i--) { matrix[i][left] num; } left;4. 完整代码实现将上述部分组合起来完整的解决方案如下vectorvectorint generateMatrix(int n) { vectorvectorint matrix(n, vectorint(n)); int num 1; int left 0, right n - 1; int top 0, bottom n - 1; while (left right top bottom) { // 从左到右 for (int i left; i right; i) { matrix[top][i] num; } top; // 从上到下 for (int i top; i bottom; i) { matrix[i][right] num; } right--; // 从右到左 for (int i right; i left; i--) { matrix[bottom][i] num; } bottom--; // 从下到上 for (int i bottom; i top; i--) { matrix[i][left] num; } left; } return matrix; }5. 复杂度分析5.1 时间复杂度由于我们需要填充n²个元素每个元素只被访问一次因此时间复杂度为O(n²)。5.2 空间复杂度除了返回的矩阵外我们只使用了常数个额外变量因此空间复杂度为O(1)不考虑返回矩阵的空间。6. 边界情况处理6.1 n1的情况当n1时矩阵只有一个元素[[1]]我们的代码也能正确处理这种情况。6.2 奇数和偶数n无论n是奇数还是偶数代码都能正确处理。对于奇数n中心点会在最后被填充对于偶数n所有层都能完整填充。7. 调试技巧7.1 打印中间结果在开发过程中可以在每个方向填充后打印当前矩阵状态方便调试void printMatrix(const vectorvectorint matrix) { for (const auto row : matrix) { for (int num : row) { cout num \t; } cout endl; } cout ----------------- endl; }7.2 边界值测试建议测试以下情况n1n2n3n4 确保各种边界情况都能正确处理。8. 常见错误与修正8.1 边界条件错误常见错误是边界条件处理不当导致重复填充或漏填。例如忘记更新边界(top, right--等)循环条件错误(使用而不是)8.2 索引越界在从右到左和从下到上填充时要特别注意索引不要越界。确保右边界right不小于左边界left下边界bottom不小于上边界top9. 优化思路9.1 减少循环次数可以观察到当left right时只需要填充垂直方向当top bottom时只需要填充水平方向。可以添加特殊处理if (left right) { for (int i top; i bottom; i) { matrix[i][left] num; } break; } if (top bottom) { for (int i left; i right; i) { matrix[top][i] num; } break; }9.2 预分配内存虽然vector会自动管理内存但对于大n值预先分配好内存可能有一定性能提升matrix.reserve(n); for (auto row : matrix) { row.reserve(n); }10. 类似题目推荐掌握了螺旋矩阵II后可以尝试以下类似题目螺旋矩阵I编号54给定矩阵按螺旋顺序读取旋转图像编号48顺时针旋转图像90度对角线遍历编号498按对角线顺序遍历矩阵11. 个人心得在实际编码过程中我发现画出矩阵的示意图对理解很有帮助。可以用纸笔画出n3、n4的情况标出填充顺序和边界变化。这样能更直观地理解算法流程。另一个技巧是使用一致的变量命名。我选择left/right/top/bottom这种直观的命名而不是更短的l/r/t/b虽然代码稍长但可读性更好。最后边界条件的处理是这类问题的关键。建议先处理一般情况再仔细考虑各种边界情况确保代码的健壮性。