数据结构学习(1)----数组之螺旋矩阵Ⅱ

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

在这里插入图片描述
在这里插入图片描述
思路:模拟过程,设置边界。
在这里插入图片描述
生成一个 n×n 空矩阵 res(二维数组),随后模拟整个向内环绕的填入过程:
定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;
当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:
执行 num += 1:得到下一个需要填入的数字;
更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
最终返回 res即可。
参考:作者:jyd

以下是Java的代码,这种解法值得学习

public int[][] generateMatrix(int n) {
    
    
        //大神解法的解读
        int left = 0, right = n-1, top = 0, bottom = n-1;
        int count = 1, target = n * n;
        int[][] res = new int[n][n];
        //for循环中变量定义成i或j的细节:按照通常的思维,i代表行,j代表列
        //这样,就可以很容易区分出来变化的量应该放在[][]的第一个还是第二个
        //对于变量的边界怎么定义:
            //从左向右填充:填充的列肯定在[left,right]区间
            //从上向下填充:填充的行肯定在[top,bottom]区间
            //从右向左填充:填充的列肯定在[right,left]区间
            //从下向上填充:填充的行肯定在[bootom,top]区间
        //通过上面的总结会发现边界的起始和结束与方向是对应的
        while(count <= target){
    
    
            //从左到右填充,相当于缩小上边界
            for(int j = left; j <= right; j++) res[top][j] = count++;
            //缩小上边界
            top++;
            //从上向下填充,相当于缩小右边界
            for(int i = top; i <=bottom; i++) res[i][right] = count++;
            //缩小右边界
            right--;
            //从右向左填充,相当于缩小下边界
            for(int j = right; j >= left; j--) res[bottom][j] = count++;
            //缩小下边界
            bottom--;
            //从下向上填充,相当于缩小左边界
            for(int i = bottom; i >= top; i--) res[i][left] = count++;
            //缩小左边界
            left++;
        }
        return res;
}

下面是js的代码

/**
 * @param {number} n
 * @return {number[][]}
 */

var generateMatrix = function(n) {
    
    
    let num = 1,t = 0,l = 0,r =n-1,b = n-1;
    const target = n*n
    const res = new Array(n).fill(0).map(()=>new Array(n).fill(0))
    while(num<=target){
    
    
        //从左到右
        for(let i = l;i <= r; i++){
    
    
            res[t][i]=num++
        }
        t++
        //从上到下
        for(let i =t ; i <= b;i++){
    
    
            res[i][r]=num++
        }
        r--
        //从右到左
        for(let i = r ;i >= l;i--){
    
    
            res[b][i]=num++
        }
        b--
        //从下到上
        for(let i = b ; i>= t;i-- ){
    
    
            res[i][l]=num++
        }
        l++
    }
    return res 
};

猜你喜欢

转载自blog.csdn.net/weixin_43449246/article/details/128661514
今日推荐