题目:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例1:

输入: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]
解析:
这里的核心思路是:边界收缩法
-
建立四个边界指针
我们维护四个变量来标记当前要遍历的"层"的边界:
top:当前层的顶部行索引
bottom:当前层的底部行索引
left:当前层的左边界列索引
right:当前层的右边界列索引
初始化时:
top = 0(矩阵最上面一行)
bottom = 矩阵行数-1(矩阵最下面一行)
left = 0(矩阵最左边一列)
right = 矩阵列数-1(矩阵最右边一列)
-
循环执行四个方向的遍历
每一轮循环完成一圈的遍历,包含四个阶段:
阶段1️⃣:从左到右遍历上边界
从 left 到 right,遍历第 top 行的元素
完成后,top++(上边界向下移动一层)
阶段2️⃣:从上到下遍历右边界
从 top 到 bottom,遍历第 right 列的元素
完成后,right--(右边界向左移动一层)
阶段3️⃣:从右到左遍历下边界
从 right 到 left,遍历第 bottom 行的元素
完成后,bottom--(下边界向上移动一层)
阶段4️⃣:从下到上遍历左边界
从 bottom 到 top,遍历第 left 列的元素
完成后,left++(左边界向右移动一层)
-
终止条件
每个方向遍历结束后,都需要检查是否还有元素未遍历:
当 top > bottom 时:所有行都已遍历完
当 left > right 时:所有列都已遍历完
只要满足其中一个条件,说明所有元素都已遍历完毕,循环终止。
具体代码:
javascript
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
let left = 0
let right = matrix[0].length-1
let top = 0
let bottom = matrix.length-1
let res = []
while(true){
//从左到右遍历上边界
for(let i = left;i<=right;i++){
res.push(matrix[top][i])
}
top++
if(top>bottom) break
//从上到下遍历右边界
for(let j = top;j<=bottom;j++){
res.push(matrix[j][right])
}
right--
if(right<left) break
//从右到左遍历下边界
for(let k = right;k>=left;k--){
res.push(matrix[bottom][k])
}
bottom--
if(bottom<top) break
//从下到上遍历左边界
for(let m = bottom;m>=top;m--){
res.push(matrix[m][left])
}
left++
if(left>right) break
}
return res
};