思路
1.矩阵遍历是顺时针遍历
2.先遍正序历数组第一个元素数组,再正序遍历数组每个元素数组的最后一个元素
3.再逆序遍历数组最后一个元素数组
4.再从下到上也就是(逆序)遍历每个数组的第一个元素。
这个是思路
具体执行
1. 一个state用来做状态存储,上面四个思路对应四个状态。
2.上面四个思路,每次遍历完都需要删除相对应元素或者数组
2. 使用while 循环,循环的条件就是 数组长度不为空;
下面是具体代码
/**
*
* @param matrix int整型二维数组
* @return int整型一维数组
*/
function ddelete(matrix){
for (let i = matrix.length - 1; i >= 0; i--) {
if (matrix[i].length == 0) {
matrix.splice(i, 1);
}
}
}
function spiralOrder(matrix) {
// write code here
if (matrix.length === 0) return [];
const arry = [];
let state = 1;
// var l = 0, r = matrix[0].length -1,
// t = 0, b = matrix.length -1;
while (matrix.length) {
if (state == 1 && matrix.length) {
for (let i = 0; i < matrix[0].length; i++) {
arry.push(matrix[0][i]);
}
matrix.shift();
state = 2;
}
if (state == 2 && matrix.length) {
for (let i = 0; i < matrix.length; i++) {
arry.push(matrix[i].pop());
}
ddelete(matrix);
state = 3;
}
if (state == 3 && matrix.length) {
const t = matrix[0].length - 1;
const end = matrix.length - 1;
for (let i = t; i >= 0; i--) {
arry.push(matrix[end][i]);
}
matrix.pop();
state = 4;
}
if (state == 4 && matrix.length) {
const end = matrix.length - 1;
for (let i = end; i >= 0; i--) {
arry.push(matrix[i].shift());
}
ddelete(matrix);
state = 1;
}
}
return arry;
}
module.exports = {
spiralOrder : spiralOrder
};