golang刷leetcode 螺旋矩阵

2022-08-02 15:48:52 浏览数 (1)

归纳:

对于螺旋矩阵之类的题目有很多变形,但是除了边界条件不同外,都是两层循环的左右边界向外扩展或者向内收敛的问题,因此一般只要控制好循环左右上下边界的增减,问题便解决了

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

示例 1:

代码语言:javascript复制
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

代码语言:javascript复制
输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
代码语言:javascript复制
func spiralOrder(matrix [][]int) []int {
  if len(matrix) < 1 {
    return []int{}
  }
  left := 0
  up := 0
  down := len(matrix) - 1
  right := len(matrix[0]) - 1
  var r []int
  for left <= right && up <= down {
    for i := left; i <= right; i   {
      r = append(r, matrix[up][i])
    }
    for j := up   1; j <= down; j   {
      r = append(r, matrix[j][right])
    }
    if left < right && up < down {
      for i := right - 1; i >= left; i-- {
        r = append(r, matrix[down][i])
      }
      for j := down - 1; j >= up 1; j-- {
        r = append(r, matrix[j][left])
      }
    }

    left  
    right--
    up  
    down--
    fmt.Println(r)
  }
  return r
}

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

代码语言:javascript复制
输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
代码语言:javascript复制
func generateMatrix(n int) [][]int {
  if n < 1 {
    return [][]int{}
  }
  left := 0
  up := 0
  down := n - 1
  right := n - 1
    r:=make([][]int,n)
    for i:=0;i<n;i  {
        r[i]=make([]int,n)
    }
    k:=1
  for left <= right && up <= down {
    for i := left; i <= right; i   {
      r[up][i]=k
            k  
    }
    for j := up   1; j <= down; j   {
            r[j][right]=k
            k  
    }
    if left < right && up < down {
      for i := right - 1; i >= left; i-- {
           r[down][i]=k
            k  
      }
      for j := down - 1; j >= up 1; j-- {
           r[j][left]=k
            k  
      }
    }

    left  
    right--
    up  
    down--
  }
  return r
}

RC 列的矩阵上,我们从 (r0, c0) 面朝东面开始

这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。

现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。

每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。

最终,我们到过网格的所有 R * C 个空间。

按照访问顺序返回表示网格位置的坐标列表。

示例 1:

代码语言:javascript复制
输入:R = 1, C = 4, r0 = 0, c0 = 0
输出:[[0,0],[0,1],[0,2],[0,3]]

示例 2:

代码语言:javascript复制
输入:R = 5, C = 6, r0 = 1, c0 = 4
输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]

提示:

  1. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= c0 < C
代码语言:javascript复制
func spiralMatrixIII(R int, C int, r0 int, c0 int) [][]int {

  if R <=0 || C<=0 {
    return [][]int{}
  }
  a := make([][]int, R)
  for i := 0; i < R; i   {
    a[i] = make([]int, C)
  }
  k := 1
  right := 1
  down := 1
  left := 0
  up := 0
  a[r0][c0] = k
  k  
   var r [][]int
    r=append(r,[]int{r0,c0})
  for c0 right < C || r0 down < R || c0-left >= 0 || r0-up >= 0 {
    for i := c0 - left   1; i <= c0 right; i   {
      if r0-up >= 0 && i < C && i>=0 {
        a[r0-up][i] = k
        k  
                r=append(r,[]int{r0-up,i})
      }
    }
    fmt.Println(a)
    for j := r0 - up   1; j <= r0 down; j   {
      if c0 right < C && j < R && j>=0{
        a[j][c0 right] = k
        k  
                 r=append(r,[]int{j,c0 right})
      }
    }
    fmt.Println(a)
    for i := c0   right - 1; i >= c0-left-1; i-- {
      if r0 down < R && i>=0 && i<C {
        a[r0 down][i] = k
        k  
                 r=append(r,[]int{r0 down,i})
      }
    }
    fmt.Println(a)
    for j := r0   down - 1; j >= r0-up-1; j-- {
      if j >= 0 && c0-left-1 >= 0 && j<R {
        a[j][c0-left-1] = k
        k  
                 r=append(r,[]int{j,c0-left-1})
      }
    }
    fmt.Println(a)
      left  
      up  
      right  
      down  
    

  }
  return r
}

0 人点赞