LeetCode59 - 螺旋矩阵 II | 算法练习系列

150 阅读2分钟

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

前言

今天来一道遍历数组的题目,名字叫做螺旋矩阵,主要考验的是对边界问题的判断,之前做过一道比这个简单的类似题目,可以点击这里查看

题目描述

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

image.png

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

示例 2:

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

解题思路

这题的核心解题思路如下:

  • 首先要明确生成的矩阵中的值是有什么组成的
  • 由于生成的矩阵是顺时针的,所以要考虑各个边距问题
  • 这里声明了四个变量,up,down,left,right,分别代表了四个边界
  • 第一个循环是从左到右,这是横坐标是不变,当达到边界条件时停止,并且横坐标++,因为下一轮就要到第二行了
  • 第二个循环是从上到下,这是纵坐标是不变的,当达到边界条件时停止,right--,因为每循环一次后下次的边界都会减1
  • 第三个循环和第一个循环逻辑正好相反,但思路是一样的
  • 第四个循环和第二个循环逻辑相反,思路也是一样的
  • 最后记得每次循环都要把index当前值存入二维数组,当index不满足小于等于n*n时输出二维数组就是所需的答案了 代码如下:
/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    const matrix = new Array(n).fill(0).map(() => new Array(n).fill(0));//声明二维数组,用来存储结果
    let up = 0,down = n-1,left = 0,right = n - 1,index = 1 //初始四个边界的值,会随着运行状态改变
    while(index<=n*n){ //index的最大值就是等于n*n的时候,作为结束循环的条件
        for(let i=left;i<=right;i++){
            matrix[up][i] = index++;
        }
        up++
        for(let i=up;i<=down;i++){
            matrix[i][right] = index++
        }
        right--
        for(let i=right;i>=left;i--){
            matrix[down][i] = index++
        }
        down--
        for(let i=down;i>=up;i--){
            matrix[i][left]=index++
        }
        left++
    }
    return matrix
};

运行结果如下:

image.png

总结

这个题目的描述很短,但其中注意的点还是不少的,特别是对边界的处理,只要把边界的变化给处理好了那问题就迎刃而解了。有时候光看题目真看不懂,在本子画画有时候就会清晰很多,还得是多看题,见得多了思路就广了。