题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[ [1] ]
读题获取信息
- 生成的是正整数的正方形
- 因此如果 n为偶数,那么正方形由 多个 循环圈数组成,如
n=4
时,如下图所示,正方形由 外圈1-12
和 内圈13-16
组成
| 1 | 2 | 3 | 4 |
| ---- | ---- | ---- | ---- |
| 12 | 13 | 14 | 5 |
| 11 | 16 | 15 | 6 |
| 10 | 9 | 8 | 7 | - 如果 n为奇数,那么正方形由 多个循环圈数 再加 1个数组成
思路
综上可以想到
- 按题目要求顺时针 循环赋值,循环的条件就是 旋转的圈数(n/2),
n = 3
,转一圈,加一个数n = 4
,转两圈n = 5
,转两圈,加一个数n = 6
,转三圈 - 再细化每一圈,顺时针赋值可分为四个部分,从左到右,从上到下,从右到左,从下到上
- 每一部分都通过一个 for循环来进行判断赋值
- 重点在于每一部分的都要保持 循环不变量,也就是保证左闭右开或者左闭右闭
本题使用了左闭右开的形式文章来源:https://www.toymoban.com/news/detail-403824.html
代码实现文章来源地址https://www.toymoban.com/news/detail-403824.html
class Solution {
public int[][] generateMatrix(int n) {
int[][] arr = new int[n][n];
if(n==1){
return new int[][]{{1}};
}
//赋的值
int count = 1;
//offset用于处理 圈数递增后 判断范围的相应改变
int offset = 1;
//x,y代表 每圈的起始位置
int x=0,y=0;
//p,q用于循环赋值指代 二维数据具体位置
int p=0,q=0;
//循环圈数
int loop = 0;
while(loop<n/2){
//处理圈数的第一部分,下面的循环依此类推
// n-offset 代表 右开,代入数字即很好理解
for( q=y; q<n-offset ;q++){
arr[x][q] = count++;
}
for(p=x;p<n-offset;p++){
arr[p][q] = count++;
}
//q > y也是如此,代表右开
for(;q>y;q--){
arr[p][q] = count++;
}
for(;p>x;p--){
arr[p][q] = count++;
}
//赋值完一圈之后,走下一圈
loop++;
//走一下圈,对应的 判断范围也需要相应修改
offset++;
//走一下圈,那么许愿起始位置也更换
x++;
y++;
}
//当n为奇数时,多出的一个数直接赋值即可,注意此处是xy,指向新的起始位置;
if(n%2==1){
arr[x][y] = count;
}
return arr;
}
}
到了这里,关于LeetCode59-螺旋矩阵||的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!