19.螺旋矩阵

45 阅读1分钟

题目链接

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

解法 模拟坐标轴

思路

模拟坐标轴就是把这个二维数组想象成坐标轴,用 x, y 来代表它的下标,而下标是经过有规律的变化,首先是向右,向下,向左,向上。

可以用两个数组来代表 x, y 的变化规律,每次累加相同的变化,如果遇到边界条件,则变化方向。

image.png

function spiralOrder(matrix: number[][]): number[] {
    const direction_x: number[] = [0, 1, 0, -1];
    const direction_y: number[] = [1, 0, -1, 0];
    const m: number = matrix.length;
    const n: number = matrix[0].length;

    const result: number[] = [];
    let i: number = 0;
    let j: number = 0;
    let direction: number = 0; // 方向坐标
    for (let k = 0; k < m * n; k++) {
        result.push(matrix[i][j]);
        matrix[i][j] = -200; // 代表已访问:-100 <= matrix[i][j] <= 100

        let x = i + direction_x[direction]; // 获取下一个坐标
        let y = j + direction_y[direction];

        // 如果超过 或则 小于0 或者 已访问 说明就要调转方向
        if (x >= m || x < 0 || y >= n || y < 0 || matrix[x][y] === -200) {
            direction = (direction + 1) % 4; // 调转方向,下一个
            x = i + direction_x[direction];
            y = j + direction_y[direction];
        }

        i = x;
        j = y;
    }

    return result;
};

时空复杂度

时间复杂度:O(m * n)

空间复杂度:O(m * n)