给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解法 模拟坐标轴
思路
模拟坐标轴就是把这个二维数组想象成坐标轴,用 x, y
来代表它的下标,而下标是经过有规律的变化,首先是向右,向下,向左,向上。
可以用两个数组来代表 x, y
的变化规律,每次累加相同的变化,如果遇到边界条件,则变化方向。
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)