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

代码

results matching ""

    No results matching ""