螺旋矩阵 II

134 阅读1分钟

题目描述

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

image.png

示例1:

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

示例二:

输入: n = 1
输出: [[1]]

思路

  1. 要注意遵循循环不变量的原则:左闭右闭或者是左闭右开
  2. 每次循环结束之后,下一次的高度会减2(上面减1-——>往下走,下面减1————>往上走),宽度也会减2(左边减1,右边减1)(i行j列)

image.png

代码

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let startX=0; //初始行位置
    let startY=0; //初始列位置
    let offset=1; // 偏移量
    let count=1; //值
    let result=new Array(n).fill(0).map(_ => new Array(n).fill(0)); //结果数组,二维数组,初始化为0
    let i; //行
    let j; //列
    let times=parseInt(n/2); //能循环的次数,每次循环高度减2,所以n/2可以得出能循环多少次
    let mid=parseInt(n/2); //中间值

    //进入循环
    while(times>0){
        //第一行
        for(j=startY;j<n-offset;j++){
            result[startX][j]=count++;
        }

        //第j列
        for(i=startX;i<n-offset;i++){
            result[i][j]=count++;
        }
        
        //第i行
        for(;j>startY;j--){
            result[i][j]=count++;
        }

         //第一列
        for(;i>startX;i--){
            result[i][j]=count++;
        }  
    
        //进入下一次循环,高度减2,宽度减2
        startX++; 
        startY++;
        offset++;
        times--; 
    }
    
    //如果n为奇数,那最后一次循环只有一个数,便是result[mid][mid]
    if(n%2==1){
        result[mid][mid]=count;
    }
    
    //返回result
    return result;
   
};

结果

image.png

总结

该题有两大难点:

  1. 循环次数问题
  2. 循环不变量的规则问题,要统一一个规则,否则很容易把自己绕晕。