1. 题目描述
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
2. 解题思路
这道题目的思路和54.螺旋矩阵的思路是很像的,可以说这个题目就是54题的逆推。
这里我们定义了四个边界:
- 上边界 top : 0
- 下边界 bottom : n - 1
- 左边界 left : 0
- 右边界 right : n - 1
同时还定义了一个cur,它表示当前的值,在每次给矩阵赋值的时候都会加一。需要注意的是,在每遍历完一条边,都会将这条边向中心进行缩窄,知道最后cur等于n*n的,则遍历结束。
复杂度分析:
时间复杂度:O(n * n),在遍历的过程中,需要给矩阵的每一个点进行赋值,这个矩阵中共有n n个点,所以时间复杂度为O(n n)。
空间复杂度:O(n * n)。
3. 代码实现
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
const res = []
for (let i = 0; i < n; i++) {
res[i] = [];
}
let top = 0, left = 0, bottom = n - 1, right = n - 1, cur = 1
while(cur <= n * n){
// 遍历上边
for(let i = left; i <= right; i++){
res[top][i] = cur++
}
top++
// 遍历右边
for(let i = top; i <= bottom; i++){
res[i][right] = cur++
}
right--
// 遍历下边
for(let i = right; i >= left; i--){
res[bottom][i] = cur++
}
bottom--
// 遍历左边
for(let i = bottom; i >= top; i--){
res[i][left] = cur++
}
left++
}
return res
};