按层模拟
解题思路
可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素;
对于每层,从左上方开始以顺时针的顺序遍历所有元素:
- 从左到右遍历 上 侧元素;
- 从上到下遍历 右 侧元素;
- 从右到做遍历 下 侧元素;
- 从下到上遍历 左 侧元素;
向内收缩的过程,如果 上下边界、左右边界 出现了碰撞,说明已经没有内层矩阵需要打印了,停止打印即可;
复杂度
-
时间复杂度:
O(mn)
,m、n 分别为矩阵行数和列数; -
空间复杂度:
O(1)
代码实现
function spiralOrder(matrix: number[][]): number[] {
let res = [];
if (matrix.length === 0) return res;
let left = 0,
top = 0,
right = matrix[0].length - 1,
bottom = matrix.length - 1;
while (true) {
// 从左向右打印,上边界向下收缩一层
for (let i = left; i <= right; i++) res.push(matrix[top][i]);
if (++top > bottom) break; // 碰撞检测
// 向上到下打印,右边界向左收缩一层
for (let i = top; i <= bottom; i++) res.push(matrix[i][right]);
if (left > --right) break; // 碰撞检测
// 从右向左打印,下边界向上收缩一层
for (let i = right; i >= left; i--) res.push(matrix[bottom][i]);
if (top > --bottom) break; // 碰撞检测
// 从下向上打印,左边界向右收缩一层
for (let i = bottom; i >= top; i--) res.push(matrix[i][left]);
if (++left > right) break; // 碰撞检测
}
return res;
};
参考资料
前端监控
上一篇