JavaScript 数据结构与算法

JavaScript 算法(螺旋矩阵)

2020-05-13  本文已影响0人  阿畅_
示例 1:
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:
输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

来源:力扣(LeetCode)

思路

image.png
function spiralOrder(ary) {
  // 处理每一圈的数据遍历过程
  let map = (ary, r = []) => {
    for (let i = 0, len = ary.length; i < len; i++) {
      // 如果是第一行,直接复制就行
      if(i === 0) {
        r = r.concat(ary[i])
      } else if (i === len - 1) { // 如果是最后一行,翻转数组
        r = r.concat(ary[i].reverse())
      } else { // 其他只取 最后一个数
        r.push(ary[i].pop())
      }
    }
    // 删除最后一行 和 第一行
    ary.shift()
    ary.pop()

    for (let i = ary.length - 1; i >= 0; i--) {
      // 添加第一个元素
      r.push(ary[i].shift())
    }

    // 判断是否还有数据, 如果还有数据,递归计算
    if(ary.length) {
      return map(ary, r)
    } else {
      return r
    }
  }
  return map(ary, [])
}

console.log(spiralOrder([
  [ 1, 2, 3 ],
  [ 4, 5, 6 ],
  [ 7, 8, 9 ]
])) //输出: [1,2,3,6,9,8,7,4,5]
console.log(spiralOrder([
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]))
// [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
上一篇 下一篇

猜你喜欢

热点阅读