LeetCode刷题-螺旋矩阵II
前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个正整数n,生成一个包含1到n^2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
示例1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
矩阵
示例2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
分析过程
此题和前面的文章"螺旋矩阵"有类似之处,请看文章:螺旋矩阵
螺旋矩阵:输入矩阵,输出矩阵的螺旋数组。
螺旋矩阵II(本题):输入矩阵边长,输出螺旋矩阵。
两题的思路差不多,但是过程相反。
例如:输入n = 6,那么矩阵如图所示:

加上颜色区分螺旋层数,如图所示:

再加上箭头表示螺旋的方向和轨迹,如图所示:

可以看出,螺旋是一层一层地来的,每一层的顺时针螺旋,按照向右、向下、向左、向上的方向移动,直到回到开始元素的下一行同一列的元素,然后开始下一层的顺时针螺旋,直到到达元素n^2,结束。
第一步
定义结果数组results,保存要返回的螺旋矩阵。
第二步
定义要累加的数字num,初始为1。
定义螺旋层数索引index,初始为0。
第三步
开始循环,从1累加到n^2,每次循环构造一层螺旋的元素,每次顺时针螺旋即为向右、向下、向左、向上移动。
第四步
每次循环,构造一层螺旋的元素:
1、向右移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。
行不变,值是:螺旋层数索引index。
列从左到右,范围是:[螺旋层数索引index,n - 螺旋层数索引index - 1]。
2、向下移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。
列不变,值是:n - 螺旋层数索引index - 1。
行从上到下,范围是:[螺旋层数索引index + 1,n - 螺旋层数索引index - 1]。
3、向左移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。
行不变,值是:n - 螺旋层数索引index - 1。
列从右到左,范围是:[n - 螺旋层数索引index - 2,螺旋层数索引index]。
4、向上移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。
列不变,值是:螺旋层数索引index。
行从下到上,范围是:[n - 螺旋层数索引index - 2,螺旋层数索引index + 1]。
构造完一层螺旋的元素后:
螺旋层数索引index加1,最多加到n除以2加1就会结束循环,index <= n / 2 + 1。
第五步
循环结束,返回结果数组results。
解答代码
class Solution {
public int[][] generateMatrix(int n) {
// 定义结果数组
int[][] results = new int[n][n];
// 定义要累加的数字,初始为1
int num = 1;
// 定义螺旋层数索引,初始为0
int index = 0;
// 循环,从1累加到n的平方,每次循环构造一层螺旋的元素,每次顺时针螺旋即为向右、向下、向左、向上移动
while (num <= n * n) {
// 向右移动
// 行不变,值是:螺旋层数索引
// 列从左到右,范围是:螺旋层数索引 -> n - 螺旋层数索引 - 1
for (int i = index; i < n - index; ++i) {
results[index][i] = num++;
}
// 向下移动
// 列不变,值是:n - 螺旋层数索引 - 1
// 行从上到下,范围是:螺旋层数索引 + 1 -> n - 螺旋层数索引 - 1
for (int i = index + 1; i < n - index; ++i) {
results[i][n - index - 1] = num++;
}
// 向左移动
// 行不变,值是:n - 螺旋层数索引 - 1
// 列从右到左,范围是:n - 螺旋层数索引 - 2 -> 螺旋层数索引
for (int i = n - index - 2; i >= index; --i) {
results[n - index - 1][i] = num++;
}
// 向上移动
// 列不变,值是:螺旋层数索引
// 行从下到上,范围是:n - 螺旋层数索引 - 2 -> 螺旋层数索引 + 1
for (int i = n - index - 2; i > index; --i) {
results[i][index] = num++;
}
// 螺旋层数索引加1,最多加到n除以2加1就会结束循环,index <= n / 2 + 1
++index;
}
// 返回结果数组
return results;
}
}
提交结果
执行用时0ms,时间击败100.00%的用户,内存消耗36.1MB,空间击败98.41%的用户。

原文链接
原文链接:螺旋矩阵II