力扣题目链接
https://leetcode.cn/problems/spiral-matrix-ii/
1.1 问题描述:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ] ]
1.2 思路:
本题具体考察的还是开发者对于数组操作的一个能力。
螺旋矩阵绝对是面试中的“常客”——它不算难,不用复杂算法,就是纯纯的模拟过程,但偏偏特别考验代码掌控力。
1.21 先想明白:螺旋矩阵是怎么“画”出来的?
顺时针填充矩阵的过程,本质是“由外向内绕圈”,每一圈要做四件事:
- 填充上行:从左到右
- 填充右列:从上到下
- 填充下行:从右到左
- 填充左列:从下到上
问题的关键就在于:这四步的边界怎么定?如果每一步的规则都不一样,代码必然混乱。所以我们要给这四步定一个统一的“规矩”——比如左闭右开(就是“包含起点,不包含终点”)。
1.22 示意图
当n为奇数的时候,需要考虑矩阵中心元素的单独赋值

当n为奇数的时候,不需要考虑矩阵中心元素的单独赋值

相信看到这里的读者,已经对此类题目思路印象深刻了,下面是具体的代码实现,十分简易.
2.1 代码实现简易版
1class Solution { 2 public int[][] generateMatrix(int n) { 3 4 int arr[][] = new int[n][n]; 5 int row = 0, col = 0; // 记录 当前索引的位置 6 int loop = n / 2; // 循环圈数 7 int cir = n - 1; //每一圈的边长 8 int startNumber = 1; // 数组赋值数 9 10 // 以n等于5为例子 11 while (loop-- > 0) { 12 13 //左边到右边的循环 每一次 14 for (int i = 0; i < cir; i++) { 15 arr[row][col++] = startNumber++; 16 17 } 18 19 //上到下 20 for (int i = 0; i < cir; i++) { 21 arr[row++][col] = startNumber++; 22 } 23 //右到左 24 for (int i = 0; i < cir; i++) { 25 arr[row][col--] = startNumber++; 26 } 27 //下到上 读者可以思考循环到这个位置我们的索引是多少 28 for (int i = 0; i < cir; i++) { 29 arr[row--][col] = startNumber++; 30 } 31 32 // 更新索引为下一圈的初始位置 33 row++; 34 col++; 35 cir -= 2; 36 37 } 38 39 //更新奇数矩阵的中心位置元素的值 40 if (n % 2 != 0) { 41 arr[row][col] = startNumber; 42 } 43 44 return arr; 45 } 46}
参考文档:
① 程序员 Carl. 代码随想录(LeetCode 算法刷题攻略官网)[EB/OL]. (2025-02)[2025-10]. https://www.programmercarl.com/.
《算法刷题-数组篇之螺旋矩阵II(超简单)》 是转载文章,点击查看原文。