题目:
给你一个?m
?行?n
?列的矩阵?matrix
?,请按照?顺时针螺旋顺序?,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
思路:
先实现方向控制,得到1->2->3->6->9->8->7->4->1,在此基础上加上一个变量cycle记录转了几圈,边界判断时加上这个变量就OK了
代码:
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function (matrix) {
let x = 0, y = 0 // 当前坐标
let way = 'right' // 当前走的方向
let num = matrix.length * matrix[0].length // 要遍历的元素总数量
let cycle = 0 // 已经转了几圈
let res = [] // 输出结果
for (let i = 0; i < num; i++) {
res.push(matrix[y][x])
if (way === 'right') {
if (x + 1 < (matrix[0].length - cycle)) { // 下一步还能往右
x++
} else { // 下一步不能往右,那就往下
way = 'down'
}
}
if (way === 'down') {
if (y + 1 < (matrix.length - cycle)) { // 下一步还能往下
y++
} else { // 下一步不能往下,那就往左
way = 'left'
}
}
if (way === 'left') {
if (x - 1 >= (0 + cycle)) { // 下一步还能往左
x--
} else { // 下一步不能往左,那就往上
way = 'up'
cycle++ // 圈数加一
}
}
if (way === 'up') {
if (y - 1 >= (0 + cycle)) { // 下一步还能往上
y--
} else { // 下一步不能往上,那就往右
way = 'right'
x++
}
}
}
return res
};