持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
前言
今天来一道遍历数组的题目,名字叫做螺旋矩阵,主要考验的是对边界问题的判断,之前做过一道比这个简单的类似题目,可以点击这里查看
题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入: 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
};
运行结果如下:
总结
这个题目的描述很短,但其中注意的点还是不少的,特别是对边界的处理,只要把边界的变化给处理好了那问题就迎刃而解了。有时候光看题目真看不懂,在本子画画有时候就会清晰很多,还得是多看题,见得多了思路就广了。