【螺旋矩阵】LeetCode59螺旋矩阵Ⅱ及54螺旋矩阵解题思路及代码实现

59.螺旋矩阵Ⅱ

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

示例 1:

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

示例 2:

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

代码

// @lc code=start
/**
 * @param {number} n
 * @return {number[][]}
 */
//循环不变量原则——左闭右开
var generateMatrix = function(n) {
    
    
    let startx = 0 ,starty = 0;//起始位置[0,0]
    let loop = Math.floor(n / 2);//循环圈数
    let mid = Math.floor(n / 2);//中间位置
    let offset = 1;//控制每边长度
    let count =1;//更新填充数字1,2,3...
    /* js创建二维数组
     const arr1 = Array(3).fill(0).map(x => Array(3).fill(0)); 
     */
    let res = Array(n).fill(0).map(res => Array(n).fill(0));
    
    //循环
    //n为偶数
    while (loop) {
    
    
        let row = startx, col = starty;
        //左->右
        for (; col < n - offset; col++) {
    
    
            res[row][col] = count;
            count ++;
        }
        //上->下 
        for (; row < n - offset; row++) {
    
    
            res[row][col] = count;
            count ++;
        }

        //右->左
        for (; col > starty; col--) {
    
    
            res[row][col] = count;
            count ++;
        }
        //下->上
        for (; row > startx; row--) {
    
    
            res[row][col] = count;
            count ++;
        }

        //更新起始位置[1,1],...
        startx ++;
        starty ++;
        
        //更新offset2,3...
        offset ++;

        //更新loop
        loop --;
    }
    //n为奇数
    if (n % 2 == 1) {
    
    
        res[mid][mid] = count;
    }

    //返回数组结果
    return res;
};

54. 螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:
在这里插入图片描述

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

示例 2:

在这里插入图片描述

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

代码

// @lc code=start
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function (matrix) {
    
    
    let m = matrix.length, n = matrix[0].length;//m行n列   
    let count = m * n;//一共有多少个数
    let res = new Array();//存储结果

    let x = [0, 1, 0, -1]//x方向变化
    let y = [1, 0, -1, 0]//y方向变化

    let row = 0, col = 0;//行列变化
    let dir = 0;//方向
    let vis = Array(m).fill(false).map(res => Array(n).fill(false));//新建一个二维存储已经遍历过的值
    
	//当res长度小于总数时
    while (res.length < count) {
    
    
        res.push(matrix[row][col]);
        //将已经遍历过的值赋为true
        vis[row][col] = true;
        //判断是否合法、或者已经遍历过的,
        if (!isLegal(row + x[dir],col + y[dir], m, n) || vis[row + x[dir]][col + y[dir]] == true) {
    
    
            //换方向
            dir++;
            dir = dir % 4;
        }
        row = row + x[dir];
        col = col + y[dir];

    }
    return res;
};

//判断是否合法,合法返回true,不合法则为false
function isLegal(x, y, m, n) {
    
    
    return x >= 0 && y >= 0 && x < m && y < n;
}

总结

循环不变量原则——左闭右开。

猜你喜欢

转载自blog.csdn.net/yolo_______95/article/details/127547236
今日推荐