题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例二:
输入: n = 1
输出: [[1]]
思路
- 要注意遵循循环不变量的原则:
左闭右闭或者是左闭右开 - 每次循环结束之后,下一次的高度会减2(上面减1-——>往下走,下面减1————>往上走),宽度也会减2(左边减1,右边减1)(i行j列)
代码
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let startX=0; //初始行位置
let startY=0; //初始列位置
let offset=1; // 偏移量
let count=1; //值
let result=new Array(n).fill(0).map(_ => new Array(n).fill(0)); //结果数组,二维数组,初始化为0
let i; //行
let j; //列
let times=parseInt(n/2); //能循环的次数,每次循环高度减2,所以n/2可以得出能循环多少次
let mid=parseInt(n/2); //中间值
//进入循环
while(times>0){
//第一行
for(j=startY;j<n-offset;j++){
result[startX][j]=count++;
}
//第j列
for(i=startX;i<n-offset;i++){
result[i][j]=count++;
}
//第i行
for(;j>startY;j--){
result[i][j]=count++;
}
//第一列
for(;i>startX;i--){
result[i][j]=count++;
}
//进入下一次循环,高度减2,宽度减2
startX++;
startY++;
offset++;
times--;
}
//如果n为奇数,那最后一次循环只有一个数,便是result[mid][mid]
if(n%2==1){
result[mid][mid]=count;
}
//返回result
return result;
};
结果
总结
该题有两大难点:
- 循环次数问题
- 循环不变量的规则问题,要统一一个规则,否则很容易把自己绕晕。