【486】蛇形填充n阶方阵 | 豆包MarsCode AI刷题

112 阅读3分钟

问题描述: 小U面临一个有趣的任务:在一个n×n的方阵中填入1到n×n这些数字,并要求按照蛇形顺序从右上角开始,沿着方阵的边界顺时针进行填充。蛇形填充的特殊排列方式使得每一层数字呈现出波浪形的排列方式。

例如,当n=4时,方阵应如下所示:

10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4

你需要编写程序输出填充后的方阵,确保格式的整齐性。

测试样例: 样例1:

输入:n = 4 输出:[[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]]

样例2:

输入:n = 5 输出:[[13, 14, 15, 16, 1], [12, 23, 24, 17, 2], [11, 22, 25, 18, 3], [10, 21, 20, 19, 4], [9, 8, 7, 6, 5]]

样例3:

输入:n = 3 输出:[[7, 8, 1], [6, 9, 2], [5, 4, 3]]

解题思路:

  1. 初始化一个n×n的矩阵,所有元素为0。
  2. 定义填充方向:右、下、左、上。
  3. 从右上角开始填充,初始化当前位置和方向。
  4. 填充数字,对于每个数字,计算下一个位置。
  5. 如果下一个位置越界或已经填充,改变方向。
  6. 更新当前位置。
  7. 返回填充后的矩阵。

解题步骤:

  1. 定义一个函数solution,参数为整数n。
  2. 初始化n×n的矩阵matrix,所有元素为0。
  3. 定义填充方向directions
  4. 初始化当前位置(x, y)为右上角,方向索引direction_index为0。
  5. 遍历数字从1到n×n,填充当前位置。
  6. 计算下一个位置(next_x, next_y)
  7. 检查下一个位置是否越界或已经填充,如果是,改变方向。
  8. 更新当前位置(x, y)
  9. 返回填充后的矩阵matrix

解题代码:

def solution(n: int) -> list:
    # 初始化 n x n 的矩阵
    matrix = [[0] * n for _ in range(n)]
    
    # 定义填充方向:右、下、左、上
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    
    # 初始化当前位置和方向
    x, y = 0, n - 1  # 从右上角开始
    direction_index = 0  # 初始方向为右
    
    # 填充数字
    for num in range(1, n * n + 1):
        # 填充当前位置
        matrix[x][y] = num
        
        # 计算下一个位置
        next_x = x + directions[direction_index][0]
        next_y = y + directions[direction_index][1]
        
        # 检查下一个位置是否越界或已经填充
        if not (0 <= next_x < n and 0 <= next_y < n and matrix[next_x][next_y] == 0):
            # 如果越界或已经填充,改变方向
            direction_index = (direction_index + 1) % 4
            next_x = x + directions[direction_index][0]
            next_y = y + directions[direction_index][1]
        
        # 更新当前位置
        x, y = next_x, next_y
    
    return matrix

if __name__ == '__main__':
    print(solution(4) == [[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]])
    print(solution(5) == [[13, 14, 15, 16, 1], [12, 23, 24, 17, 2], [11, 22, 25, 18, 3], [10, 21, 20, 19, 4], [9, 8, 7, 6, 5]])
    print(solution(3) == [[7, 8, 1], [6, 9, 2], [5, 4, 3]])

解题思路详细解析:

  1. 我们首先初始化一个n×n的矩阵matrix,所有元素为0。
  2. 我们定义了四个填充方向:右、下、左、上。
  3. 我们从右上角开始填充,初始化当前位置(x, y)和方向索引direction_index
  4. 我们遍历数字从1到n×n,填充当前位置matrix[x][y]
  5. 我们计算下一个位置(next_x, next_y)
  6. 如果下一个位置越界或已经填充,我们改变方向。
  7. 我们更新当前位置(x, y)
  8. 最后,我们返回填充后的矩阵matrix

复杂度分析: 时间复杂度:O(n^2),其中n是方阵的边长。我们需要填充n^2个元素。 空间复杂度:O(n^2),因为我们需要存储n×n的矩阵。