羊的笔记(4.27)--螺旋矩阵

90 阅读1分钟

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
  };