代码随想录算法训练营第二天(3)|59.螺旋矩阵II

99 阅读2分钟

题目描述

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

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

示例 2:

**输入:**n = 1 输出:[[1]]

代码示例

from typing import List

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        rows, cols = n, n
        matrix = []

        # 初始化二维矩阵
        for _ in range(rows):
            row = [0] * cols
            matrix.append(row)

        start_row, start_col = 0, 0
        remaining_loops = n // 2
        offset = 1
        middle = n // 2
        count = 1

        # 顺时针螺旋填充矩阵
        while remaining_loops > 0:
            current_row, current_col = start_row, start_col

            # 从左到右填充
            while current_row < n - offset:
                matrix[start_row][current_row] = count
                count += 1
                current_row += 1

            # 从上到下填充
            while current_col < n - offset:
                matrix[current_col][current_row] = count
                count += 1
                current_col += 1

            # 从右到左填充
            while current_row > start_row:
                matrix[current_col][current_row] = count
                count += 1
                current_row -= 1

            # 从下到上填充
            while current_col > start_col:
                matrix[current_col][current_row] = count
                count += 1
                current_col -= 1

            start_row += 1
            start_col += 1
            remaining_loops -= 1
            offset += 2

        # 处理奇数行列的情况,填充中心元素
        if n % 2 == 1:
            matrix[middle][middle] = count

        return matrix

# 示例用法
if __name__ == "__main__":
    solution = Solution()

    # 示例 1
    n1 = 3
    result1 = solution.generateMatrix(n1)
    print(f"示例 1:n = {n1}\n{result1}")

    # 示例 2
    n2 = 4
    result2 = solution.generateMatrix(n2)
    print(f"示例 2:n = {n2}\n{result2}")

初始想法:

  1. 针对题目中的 n,我首先想到可以创建一个大小为 n-1 的二维空数组。
  2. 针对每个方向(右、下、左、上),我考虑实现相应的遍历方法。
  3. 我采用了 1n^2 作为循环遍历的条件。

代码阅读后的思考:

  1. 在确定起始坐标位置时,考虑到矩阵是顺时针螺旋填充的,需要设定起始坐标为 (0, 0)
  2. 在处理四个边界时,需要注意左闭右开区间的原则,避免数组越界。
  3. 我学到了在处理边界时,要根据循环不变量的原则,确保每个位置都被正确覆盖。
  4. 确定转的圈数是解决问题的关键,我学会了如何设置循环的次数。

实现过程中的困难:

  1. 在实现过程中,我发现需要仔细检查每一个递等式,确保每一步都正确覆盖到目标位置。

学习时长:

  1. 今天独自完成了一道复杂的代码题,花费了较长的时间,但最终成功解决了问题。
  2. 通过这道题,我对算法有了更多的信心,也学到了如何处理矩阵的螺旋填充问题。