Leetcod59:螺旋矩阵 II

题目描述:

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

代码思路:

  1. 初始化矩阵
    • 创建一个 n x n 的矩阵 res,初始时所有元素都设为 None(表示尚未填充)。
  2. 定义方向
    • 创建一个方向数组 orien,包含四个方向的向量:右 (0, 1)、下 (1, 0)、左 (0, -1)、上 (-1, 0)
    • 初始方向设为右 (0, 1),从方向数组中弹出,并再次添加到数组末尾,以便循环使用。
  3. 填充矩阵
    • 使用变量 number 来跟踪当前要填充的数字,从 1 开始。
    • 使用变量 (x, y) 来记录当前填充位置的坐标。
    • 使用变量 (dx, dy) 来记录当前移动的方向向量。
  4. 循环填充
    • 当 number 小于 n^2 时,继续循环。
    • 将当前位置 (x, y) 填充为 number
    • 计算下一个位置 (new_x, new_y),即当前位置加上方向向量 (dx, dy)
    • 检查下一个位置是否合法(在矩阵范围内且未被填充):
      • 如果合法且未被填充,更新 (x, y) 为 (new_x, new_y),继续填充下一个数字。
      • 如果不合法或已被填充,说明需要改变方向:
        • 从方向数组 orien 中弹出当前方向 (dx, dy),并将其添加到数组末尾,实现方向的循环。
        • 更新 (x, y) 为当前位置加上新的方向向量 (dx, dy)
  5. 返回结果
    • 循环结束后,矩阵 res 已被完全填充,按螺旋顺序从 1 到 n^2
    • 返回矩阵 res

代码执行流程

  • 初始化矩阵和方向。
  • 从矩阵的左上角 (0, 0) 开始,向右填充。
  • 到达矩阵边界或已填充区域时,顺时针改变方向(右->下->左->上),继续填充。
  • 重复上述过程,直到矩阵被完全填充。

代码实现:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[None for _ in range(n)] for _ in range(n)]
        orien = [(0, 1), (1, 0), (0, -1), (-1, 0)]
        number = 0
        x, y = 0, 0
        dx, dy = orien.pop(0)
        orien.append((dx, dy))
        while number < n ** 2:
            number += 1
            res[x][y] = number
            new_x, new_y = x + dx, y + dy
            if 0 <= new_x < n and 0 <= new_y < n and res[new_x][new_y] == None:
                x, y = new_x, new_y
            else:
                dx, dy = orien.pop(0)
                orien.append((dx, dy))
                x, y = x + dx, y + dy
        
        return res

 

你可能感兴趣的:(算法,leetcode,python3,DFS)