54. 螺旋矩阵

按层模拟

解题思路

  1. 可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素;

  2. 对于每层,从左上方开始以顺时针的顺序遍历所有元素:

    • 从左到右遍历 侧元素;
    • 从上到下遍历 侧元素;
    • 从右到做遍历 侧元素;
    • 从下到上遍历 侧元素;
  3. 向内收缩的过程,如果 上下边界左右边界 出现了碰撞,说明已经没有内层矩阵需要打印了,停止打印即可;

复杂度

  1. 时间复杂度:O(mn)mn 分别为矩阵行数和列数;

  2. 空间复杂度: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;
};

参考资料

  1. Krahets:《零起步学算法》

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 按层模拟
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 参考资料