输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
1 )减而治之递归实现
function spiralOrder(matrix: number[][]): number[] {
// 处理每一圈的数据遍历过程
const map = (arr: number[][], r: number[] = []) => {
// 第一圈的遍历:遍历的时候不会按照 if else if 的顺序遍历,而是会按照一行一行的遍历,所以最终顺序不用担心
for (let i = 0, len = arr.length; i < len; i++) {
if (i === 0) {
r = r.concat(arr[i])
} else if (i === len - 1) {
r = r.concat(arr[i].reverse())
} else {
// 增加边界检查
if (arr[i].length) {
r.push(arr[i].pop())
}
}
}
arr.shift() // 减而治之:移除第一行
arr.pop() // 减而治之:移除最后一行
// 第一圈最后的遍历: 倒序,从下到上
for (let i = arr.length - 1; i >= 0; i--) {
// 边界检查
if (arr[i].length) {
r.push(arr[i].shift())
}
}
// 边界判断,是否还有,有则进行递归
if (arr.length) {
return map(arr, r)
}
// 没有直接返回
return r;
}
return map(matrix, [])
};