54. 螺旋矩阵
题目链接 图解的详细做法
一、思想
1、以顺时针的方向,上右下左的进行一轮迭代,如果一条边从头遍历到底,则下一条边遍历的起点随之变化。选择不遍历到底,可以减小横向、竖向遍历之间的影响。
2、然后像内层收缩,4条边的两端同时收窄 1。进行第二轮迭代 3、循环终止的条件是 left < right && top < bottom 4、当终止的时候,只有一列的时候,就从左往右的进行遍历。只有一行的时候,就从上往下的进行遍历。
二、代码实现
var spiralOrder = function(matrix) {
let left = 0, right = matrix[0].length-1,
top = 0, bottom = matrix.length-1;
const res = []
while(top < bottom && left < right){
for(let i=left; i<right; i++) res.push(matrix[top][i]);
for(let i=top; i<bottom; i++) res.push(matrix[i][right]);
for(let i=right; i>left; i--) res.push(matrix[bottom][i]);
for(let i=bottom; i>top; i--) res.push(matrix[i][left]);
left++;
right--;
top++;
bottom--;
}
if(left == right){
for(let i=top; i<=bottom;i++) res.push(matrix[i][left]);
}
else if(top == bottom){
for(let i=left; i<=right; i++) res.push(matrix[top][i]);
}
return res;
};
|