题目:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
let matrix = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
// --------方法一【转换方向,当越界或者已经遍历过就顺时针变换方向】----------
let m = matrix.length
let n = matrix[0].length
// used:用来记录哪些地方已经遍历过了
let used = Array(m).fill().map((val)=>{
return Array(n).fill(false)
})
let totol = m*n
// index:记录正在朝着哪个方向前进
let index = 0
let direction = [[0,1],[1,0],[0,-1],[-1,0]]
let queue = []
// i,j此时遍历的坐标
let i = 0
let j = 0
queue.push(matrix[0][0])
used[0][0]= true
for(let k = 0;k<totol-1;k++){
let [now_i,now_j]=direction[index]
if(i+now_i<0||i+now_i>=m||j+now_j<0||j+now_j>=n||used[i+now_i][j+now_j]){
// 越界或前方已经遍历过就要掉转方向
index= (index+1)%4
now_i = direction[index][0]
now_j = direction[index][1]
}
queue.push(matrix[i+now_i][j+now_j])
used[i+now_i][j+now_j] = true
i=i+now_i
j=j+now_j
}
console.log(queue);
// -------方法二【一层一层循环】-------------
let matrix = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12]]
let m = matrix.length
let n = matrix[0].length
let top = 0
let bottom = m-1
let left = 0
let right = n-1
let index = Math.ceil(Math.min(m,n)/2)
let used = Array(m).fill().map((val)=>{
return Array(n).fill(false)
})
let queue=[]
while(index>0){
for(let i = left;i<=right;i++){
if(used[top][i]){
continue
}
queue.push(matrix[top][i])
used[top][i]=true
}
for(let i = top+1;i<=bottom;i++){
if(used[i][right]){
continue
}
queue.push(matrix[i][right])
used[i][right]=true
}
for(let i = right-1;i>=left;i--){
if(used[bottom][i]){
continue
}
queue.push(matrix[bottom][i])
used[bottom][i]=true
}
for(let i = bottom-1;i>top;i--){
if(used[i][left]){
continue
}
queue.push(matrix[i][left])
used[i][left] = true
}
index--
top++
bottom--
right--
left++
}
console.log(queue);