leetcode2326_go_螺旋矩阵IV

题目

给你两个整数:m 和 n ,表示矩阵的维数。

另给你一个整数链表的头节点 head 。

请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。

链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1 填充。

返回生成的矩阵。

示例 1:输入:m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]

输出:[[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]

解释:上图展示了链表中的整数在矩阵中是如何排布的。

注意,矩阵中剩下的空格用 -1 填充。

示例 2:输入:m = 1, n = 4, head = [0,1,2] 输出:[[0,1,2,-1]]

解释:上图展示了链表中的整数在矩阵中是如何从左到右排布的。

注意,矩阵中剩下的空格用 -1 填充。

提示:1 <= m, n <= 105

1 <= m * n <= 105

链表中节点数目在范围 [1, m * n] 内

0 <= Node.val <= 1000

解题思路分析

1、遍历;时间复杂度O(n^2),空间复杂度O(n^2)

// 顺时针:上右下左
var dx = []int{0, 1, 0, -1}
var dy = []int{1, 0, -1, 0}

func spiralMatrix(m int, n int, head *ListNode) [][]int {
   res := make([][]int, m)
   for i := 0; i < m; i++ {
      res[i] = make([]int, n)
      for j := 0; j < n; j++ {
         res[i][j] = -1
      }
   }

   x, y, dir := 0, 0, 0
   for ; head != nil; head = head.Next {
      res[x][y] = head.Val
      newX, newY := x+dx[dir], y+dy[dir]
      if 0 > newX || newX >= m || 0 > newY || newY >= n || res[newX][newY] != -1 {
         dir = (dir + 1) % 4 // 换方向
      }
      x = x + dx[dir]
      y = y + dy[dir]
   }
   return res
}

总结

Medium题目,链表题目,考察螺旋矩阵的遍历

原文链接:,转发请注明来源!