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 = 1while(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};
4. 提交结果

