59.螺旋矩阵2

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function (n) {
    // 很妙的解法!
    // 设置边界top,bottom,left,right
    // 按右、下、左、上 顺序遍历,边界缩小
    // 初始化边界值
    let top = 0
    let right = n - 1
    let bottom = n - 1
    let left = 0

    let num = 1
    let matrix = new Array(n).fill(0).map(e => new Array(n).fill(0))

    while (num <= n * n) {
        // 右
        for (let i = left; i <= right; i++) {
            matrix[top][i] = num
            num++
        }
        top++ // 最上面一层填完了,缩小上边界

        // 下
        for (let i = top; i <= bottom; i++) {
            matrix[i][right] = num
            num++
        }
        right-- // 最右边一层填完了,缩小右边界

        // 左
        for (let i = right; i >= left; i--) {
            matrix[bottom][i] = num
            num++
        }
        bottom-- // 最下面一层填完了,缩小下边界

        // 上
        for (let i = bottom; i >= top; i--) {
            matrix[i][left] = num
            num++
        }
        left++ // 最左边一层填完了,缩小左边界
    }

    return matrix
};