给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
原题来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
思路
判断出路线都是有固定方向的 先→再↓再←再↑再→…一直循环到没有数字。
有4个方向边界 当触及边界时即按固定方向转向,且其对应的边界值向内收缩1
若没触及边界,就按自身方向继续行走,直到坐标值触边界/数字全部遍历过。
var spiralOrder = function(matrix) {
var res=[]
var i=0
var j=0
var n=matrix.length-1
if(n<0)
return []
var m = matrix[0].length-1
var turn = m==0?'d':'r' //1行n列数组
var boundl = 0
var boundr = m
var boundu = 0
var boundd = n
for(var a=0;a<(m+1)*(n+1);a++){
res.push(matrix[i][j]);
if(turn=='r'){
j++
if(j==boundr){
boundu++ //相当于对应边界缩1
turn='d'
}
}else if(turn=='d'){
i++
if(i==boundd){
boundr--
turn='l'
}
}else if(turn=='l'){
j--
if(j==boundl){
boundd--
turn='u'
}
}else if(turn=='u'){
i--
if(i==boundu){
boundl++
turn='r'
}
}
}
return res
};