# 螺旋矩阵

  • 题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

  • 示例

示例 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 思路

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]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43