/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型二维数组
* @return int整型一维数组
*/
function spiralOrder(matrix) {
// write code here
let ans = [];
let m = matrix.length;
if (m == 0) {
return ans;
}
let n = matrix[0].length;
let v = new Array(m + 1).fill(0).map((x) => (x = new Array(n + 1).fill(0)));
// 边界标记
for (let i = 0; i < m + 1; i++) {
v[i][n] = 1;
}
// 边界标记
for (let i = 0; i < n + 1; i++) {
v[m][i] = 1;
}
// 偏移数组
let xx = [0, 1, 0, -1],
yy = [1, 0, -1, 0];
// 初始化数据
let i = 0,
j = 0,
mod = 0,
cnt = m * n;
function check(x, y) {
// 判断边界和是否已经标记
if (x < 0 || y < 0 || x >= m || y >= n || v[x][y] == 1) {
return false;
}
return true;
}
// 当计数大于0
while (cnt > 0) {
// 检查当前坐标
while (check(i, j)) {
// 添加倒答案数组
ans.push(matrix[i][j]);
// 标记
v[i][j] = 1;
// 减少计数
cnt--;
// 坐标偏移
i += xx[mod];
j += yy[mod];
}
// 因为跳出循环的时候已经偏移了,所以要返回上一状态
i -= xx[mod];
j -= yy[mod];
mod = (mod + 1) % 4;
// 偏移倒下一状态
i += xx[mod];
j += yy[mod];
}
return ans;
}
module.exports = {
spiralOrder: spiralOrder,
};