思路
- 判断是否是空数组
顺时针打印数组 可以按照字面意思 从外向里进行圈层遍历 。 - 判断圈数
可以遍历的圈数是根据短边来判断的
这里有三种情况
- 圈数为偶数的情况
- 圈数为奇数的情况 且长>=宽
- 圈数为奇数的情况 且长<宽
当为偶数时 直接按照下面第一张图 将一圈分为四个部分 依次从顶点遍历即可
当为奇数时 会产生行/列的冗余 最后只需要把冗余部分 依次push进数组就可以了
代码
var spiralOrder = function(matrix) {
if (matrix.length == 0) return [];
let result = [];
let l = matrix[0].length;
let m = matrix.length;
let n = l <= m ? l : m;
for (let i = 0; i < (n + 1) / 2 - 1; i++) {
let s = 0;
while (s < l - i * 2 - 1) {
result.push(matrix[i][i + s]);
s++;
}
s = 0;
while (s < m - i * 2 - 1) {
result.push(matrix[i + s][l - 1 - i]);
s++;
}
s = 0;
while (s < l - i * 2 - 1) {
result.push(matrix[m - 1 - i][l - 1 - i - s]);
s++;
}
s = 0;
while (s < m - i * 2 - 1) {
result.push(matrix[m - 1 - i - s][i]);
s++;
}
}
if(n%2==0){
return result
}
if (l >= m) {
let q = Math.floor((m + 1) / 2) - 1;
let s = l - q * 2;
for (let i = 0; i < s; i++) {
result.push(matrix[(m + 1) / 2 - 1][q + i]);
}
}
if (m > l) {
let q = Math.floor((l + 1) / 2) - 1;
let s = m - q * 2;
for (let i = 0; i < s; i++) {
result.push(matrix[q + i][(l + 1) / 2 - 1]);
}
}
return result
};