算法--螺旋矩阵 II

99 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

题目

leetcode 59. 螺旋矩阵 II 难度:中等

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

示例 1:

image.png

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

示例 2:

image.png

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

提示:

1 <= n <= 20

题解

题目的意思是让我们根据矩阵来然后顺时针输出里面的数字。
我们就可以标记顺时针旋转的4个方向:

  • 0代表向右
  • 1代表向下
  • 2代表向左
  • 3代表向上

建立二维坐标系,通过坐标和方向来完成输出。值得关注的是如何控制坐标的移动,移动的节点如何控制。

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function (matrix) {
    let left = 0 
    let right = n - 1 
    let bottom = n - 1 
    let top = 0 
    const total = n * n 
    const dep = [] 

    for(let i =0;i < n;i++) {
        dep[i] = []
    }

    let count = 0 

    while(count < total) {
        for(let i = left;i <= right;i++) dep[left][i] = ++count 
        top++
        for(let i = top;i <= bottom;i++) dep[i][right] = ++count 
        right--
        for(let i = right;i >= left;i--) dep[bottom][i] = ++count 
        bottom--
        for(let i = bottom;i >= top;i--) dep[i][left] = ++count 
        left++
    }
    return dep
};

代码详解

初始化方向let left = 0 let right = n - 1 let bottom = n - 1 let top = 0 ,

使用while进行判断:大方向不变,顺序仍然是右、下、左、上,使用while判断保证,一旦往一个方向走就会一直走到尽头才会换方向。

  • 第一条边:左闭右闭,上行 索引的列变 行不变,且 列的变化顺序为从左到右,
  • 第二条边:上开下闭,右列 索引的行变 列不变 且 行的变化顺序为从上到下
  • 第三条边:右开左闭,下行 索引的列变 行不变 且 列的变化顺序为从右到左
  • 第四条边:下开上开,左列 索引的行变 列不变 且 行的变化顺序为从下到上

到达边际时,四个角对应的边收缩。