4.27(螺旋矩阵)
目前跑到最快的解,大佬,直接看代码和注释更能加深印象
var spiralOrder = function (matrix) {
var n = []//结果
while (matrix.length) {
// 直接删除第一行
n.push(...matrix.shift())
// 遍历每一行,删除最后一个元素
for (let x of matrix) {
n.push(x.pop())
}
// 妙笔,如果一个数组只有一个元素,删除元素后不会删除数组,而是变为空数组[],空数组没必要遍历
matrix = matrix.filter(e => e.length)
// 删除最后一行并反转,秒
if (matrix.length) {
n.push(...matrix.pop().reverse())
}
// 删除每一数组的第一个元素,第一列
for (let i = matrix.length - 1;i >= 0;i--) {
n.push(matrix[i].shift())
}
// 再次过滤,删除空数组,
matrix = matrix.filter(e => e.length)
// 每次循环转最外层一圈,删除最外层一圈,删完退出
}
return n
};
官方和其他一般人解法:
var spiralOrder = function (matrix) {
if (matrix.length == 0) return []
const res = []//结果
// 上下左右四条边界,不改变 原数据,通过挤压,
let top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1
// 挤压法,规定边界,循环
while (top <= bottom && left <= right) {
// 上边
for (let i = left; i <= right; i++) res.push(matrix[top][i])
top++
// 右边
for (let i = top; i <= bottom; i++) res.push(matrix[i][right])
right--
//妙笔-----出现交错则退出,因为我们循环时有两个判断条件,
//有可能在进行一半循环的时候就结束循环了,但是一次循环没有结束
//下面的半个循环都是我们多进行的,所以可能会产生超时问题,
//也可以在每句循环后面进行判断
if (top > bottom || left > right) break
// 下边
for (let i = right; i >= left; i--) res.push(matrix[bottom][i])
bottom--
// 左边
for (let i = bottom; i >= top; i--) res.push(matrix[i][left])
left++
}
return res
};