青训营笔记10 | 豆包MarsCode AI刷题

14 阅读3分钟

问题描述

蛇形填充n阶方阵

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

例如,当 n=4n=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. 处理边界条件:在填充过程中,需要注意边界条件,避免越界。

实现

def solution(n: int) -> list:
    # 初始化方阵
    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

复杂度

时间复杂度分析

  1. 初始化方阵:初始化一个 n×nn×n 的二维列表,时间复杂度为 O(n2)O(n^2)
  2. 填充数字:填充数字的过程是一个循环,从 1 到 n * n,总共需要填充 n2n^2 个数字。每次填充时,需要计算下一个位置并检查是否需要改变方向。计算下一个位置和检查边界条件的时间复杂度为 O(1)O(1)。因此,填充数字的总时间复杂度为 O(n2) O(n^2)

所以整个算法的时间复杂度为 O(n2) O(n^2)

空间复杂度分析

  1. 方阵的空间:使用一个 n×nn×n 的二维列表来存储方阵,因此空间复杂度为 O(n2)O(n^2)
  2. 方向列表:方向列表是一个固定大小的列表,包含四个方向,因此空间复杂度为 O(1)O(1)

所以整个算法的空间复杂度为 O(n2)O(n^2)