【JS每日一算法】53.螺旋矩阵 II(模拟法)

150 阅读1分钟

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

提示:

  • 1 <= n <= 20

示例:

spiraln.jpg

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

题解:

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 模拟法   TC:O(n^2)  SC:O(n^2)
 * @author: JunLiangWang
 * @param {*} n  给定整数数
 * @return {*}
 */
function simulation(n){

    /**
     * 该题与螺旋矩阵I相同,同样可以利用模拟法的方式,
     * 利用循环遍历模拟矩阵顺时针螺旋顺序输出元素
     */

    // 定义方向,0:向右,1:向下,2:向左,3:向上
    let dir = 0,
        // 当前元素所在行
        row = 0,
        // 当前元素所在列,从-1开始为了方便出来开始+1的情况
        col = -1,
        // 已经遍历了多少圈,每遍历一圈,row/col的最大值则会
        // 减一
        spinCount = 0,
        // 定义矩阵
        matrix=new Array(n).fill(0).map(()=>new Array(n));
    // 遍历矩阵所有元素
    for(let i=1;i<=n*n;i++){
        // 选择方向
        switch (dir) {
            // 向右
            case 0:
                col++;
                // 当达到右边界,方向变为向下
                if (col === n - spinCount - 1) dir++;
                break;
            // 向下
            case 1:
                row++;
                // 当达到下边界,方向变为向左
                if (row === n - spinCount - 1) dir++;
                break;
            // 向左
            case 2:
                col--;
                // 当达到左边界,方向变为向上
                if (col === spinCount) dir++;
                break;
            // 向上
            case 3:
                row--;
                // 当达到上边界,方向变为向右,并且
                // 圈数+1
                if (row === spinCount + 1) {
                    dir = 0;
                    spinCount++;
                }
                break;
        }
        // 将当前元素添加到输出数组
        matrix[row][col]=i
    }
    // 输出
    return matrix;
}

来源:力扣(LeetCode)