Skip to content

59、螺旋矩阵 II

js
;(function () {
  /**
   * 59. 螺旋矩阵 II
   * 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
   *
   * 输入:n = 3
   * 输出:[[1,2,3],[8,9,4],[7,6,5]]
   *
   * 输入:n = 1
   * 输出:[[1]]
   *
   */

  function generateMatrix(n: number): number[][] {
    // 方法一: 官网提供
    let t = 0
    let b = n - 1
    let l = 0
    let r = n - 1
    let ans: number[][] = new Array(n).fill(0).map((i) => [])
    let k = 1
    while (k <= n * n) {
      for (let i = l; i <= r; ++i, ++k) ans[t][i] = k
      ++t
      for (let i = t; i <= b; ++i, ++k) ans[i][r] = k
      --r
      for (let i = r; i >= l; --i, ++k) ans[b][i] = k
      --b
      for (let i = b; i >= t; --i, ++k) ans[i][l] = k
      ++l
    }
    return ans

    // 方法一:
    // if (!n) {
    //     return []
    // }
    // let total: number = n * n;
    // let nums: number[] = [];
    // let res: number[][] = new Array(n).fill(0).map(i => []);
    // for(let i = 1; i <= total; i++) {
    //     nums.push(i)
    // }
    // let index: number = 0;
    // let i = 0, j = 0;

    // // let key = 'A'
    // // while(index <= total) {
    // //     if (res[i] && !res[i][j]) {
    // //         res[i][j] = nums[index];
    // //         // 要归纳总结以下规律:
    // //         key === 'A' && (j < n - 1 ? j++ : key = 'B');
    // //         key === 'B' && (i < n - 1 ? i++ : key = 'C');
    // //         key === 'C' && (j > 0 ? j-- : key = 'D'); // j: 2 1 0 --> 5 6 7
    // //         key === 'D' && (i > 1 ? i-- : key = 'E'); // j=0 i--(2,1,0) --> [2][0]:7 & [1][0]:8 --> [0][0]: 1
    // //         key === 'E' && (j < n - 2 ? j++ : key = 'F');
    // //         key === 'F' && (i < n - 2 ? i++ : key = 'G');
    // //         key === 'G' && (j > 1 ? j-- : key = 'H')

    // //     }
    // //     index++
    // // }

    // let key: number | string = 0
    // let maxKey = n * 2
    // while(index <= total) {
    //     if (res[i] && !res[i][j]) {
    //         res[i][j] = nums[index];
    //         // 要归纳总结以下规律:
    //         key === maxKey && (j < n - 1 ? j++ : key = 'B');
    //         key === 'B' && (i < n - 1 ? i++ : key = 'C');
    //         key === 'C' && (j > 0 ? j-- : key = 'D'); // j: 2 1 0 --> 5 6 7
    //         key === 'D' && (i > 1 ? i-- : key = 'E'); // j=0 i--(2,1,0) --> [2][0]:7 & [1][0]:8 --> [0][0]: 1
    //         key === 'E' && (j < n - 2 ? j++ : key = 'F');
    //         key === 'F' && (i < n - 2 ? i++ : key = 'G');
    //         key === 'G' && (j > 1 ? j-- : key = 'H')
    //         while(key < maxKey) {

    //         }

    //     }
    //     index++
    // }

    // return res
  }

  // console.log(generateMatrix(1))
  // console.log(generateMatrix(2))
  console.log(generateMatrix(3))
  console.log(generateMatrix(4))
})()