持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
题目
leetcode 59. 螺旋矩阵 II 难度:中等
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入: 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判断保证,一旦往一个方向走就会一直走到尽头才会换方向。
- 第一条边:左闭右闭,上行 索引的列变 行不变,且 列的变化顺序为从左到右,
- 第二条边:上开下闭,右列 索引的行变 列不变 且 行的变化顺序为从上到下
- 第三条边:右开左闭,下行 索引的列变 行不变 且 列的变化顺序为从右到左
- 第四条边:下开上开,左列 索引的行变 列不变 且 行的变化顺序为从下到上
到达边际时,四个角对应的边收缩。