1.1. 题目
1.1.1. 螺旋矩阵
给定一个包含 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]
1.1.2. 题解:
- 数组是m*n的,需要注意对应的下标是多少
 - 可能为空数组
 
1.1.3. 思路:
- 笨方法解决 -- 顺时针挨个遍历
- 假设一圈为一层,那么层数与 m和n里的最小值有关...
 - 先获取 m和n谁是最小值,然后除以二再加一就是圈数
 - 假设数组下标是 
arr[x][y] - 假设例子是 
{1,2,3,4}, {12,13,14,5}, {11,16,15,6}, {10,9,8,7}, - 第一圈
- 先遍历 
1,2,3,4,发现数组的x是不变的,是0,一直变化的是y - 再遍历 
5,6,7,这时候是从5开始的,注意不是从4开始,注意边界范围,发现x是一直变的,y不变,就是子数组长度-1 - 再遍历 
8,9,10,这时候从7开始,还是要注意边界条件,发现x是不变的,是数组的长度-1,y一直在变 - 最后遍历 
11,12,注意边界条件,不能再去遍历到1,这时候x在变,y不变 
 - 先遍历 
 - 第二圈
- 先遍历
13,14,层数是第二层,x不变,是1,一直变化的是y - 再遍历
15,发现y不变,是 2,其实就是子数组长度-1-层数 - 再遍历
16,发现x不变, 是 2,其实就是数组长度-1-层数 - .....
 
 - 先遍历
 - 会发现,每层遍历的下标与层数有关..
 - 但是有种特殊情况,假如顺时针遍历一圈的操作是 x1,y1,x2,y2 四步是一圈的话,有可能x1有,y1为0,其实值没有了,但是x2还能满足,所以得判断,一旦这个顺序有一个不走了..说明已经遍历结束了
 - 这样操作的好处就是不需要把每个是否遍历都存一遍!只需要四个固定布尔值确定一下即可!
 
 
1.1.4. 代码:
 点击显示 
  var arr []int
      x := len(matrix)
      if x == 0 {
          return arr
      }
      y := len(matrix[0])
      var min int
      if x <= y {
          min = x
      } else {
          min = y
      }
      for l:=0;l< min>>1 + 1;l++ {
          xx := x - l
          yy := y - l
          var x1,y1,x2,y2 bool
          for i:=l;i<yy;i++ {
              arr = append(arr, matrix[l][i])
              x1 = true
          }
          if !x1 {
              return  arr
          }
          for i:=l+1;i<xx;i++ {
              arr = append(arr,matrix[i][yy-1])
              y1 = true
          }
          if !y1 {
              return arr
          }
          for i:=yy-2;i>=l;i-- {
              arr = append(arr,matrix[xx-1][i])
              x2 = true
          }
          if !x2 {
              return arr
          }
          for i:=xx-2;i>l;i-- {
              arr = append(arr,matrix[i][l])
              y2 = true
          }
          if !y2 {
              return arr
          }
      }
      return arr