1. 题目描述

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

  1. 输入: 3
  2. 输出:
  3. [
  4. [ 1, 2, 3 ],
  5. [ 8, 9, 4 ],
  6. [ 7, 6, 5 ]
  7. ]

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. 代码实现

  1. /**
  2. * @param {number} n
  3. * @return {number[][]}
  4. */
  5. var generateMatrix = function(n) {
  6. const res = []
  7. for (let i = 0; i < n; i++) {
  8. res[i] = [];
  9. }
  10. let top = 0, left = 0, bottom = n - 1, right = n - 1, cur = 1
  11. while(cur <= n * n){
  12. // 遍历上边
  13. for(let i = left; i <= right; i++){
  14. res[top][i] = cur++
  15. }
  16. top++
  17. // 遍历右边
  18. for(let i = top; i <= bottom; i++){
  19. res[i][right] = cur++
  20. }
  21. right--
  22. // 遍历下边
  23. for(let i = right; i >= left; i--){
  24. res[bottom][i] = cur++
  25. }
  26. bottom--
  27. // 遍历左边
  28. for(let i = bottom; i >= top; i--){
  29. res[i][left] = cur++
  30. }
  31. left++
  32. }
  33. return res
  34. };

4. 提交结果

image.png