题目描述
给你一个正整数 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}")
初始想法:
- 针对题目中的
n,我首先想到可以创建一个大小为n-1的二维空数组。 - 针对每个方向(右、下、左、上),我考虑实现相应的遍历方法。
- 我采用了
1到n^2作为循环遍历的条件。
代码阅读后的思考:
- 在确定起始坐标位置时,考虑到矩阵是顺时针螺旋填充的,需要设定起始坐标为
(0, 0)。 - 在处理四个边界时,需要注意左闭右开区间的原则,避免数组越界。
- 我学到了在处理边界时,要根据循环不变量的原则,确保每个位置都被正确覆盖。
- 确定转的圈数是解决问题的关键,我学会了如何设置循环的次数。
实现过程中的困难:
- 在实现过程中,我发现需要仔细检查每一个递等式,确保每一步都正确覆盖到目标位置。
学习时长:
- 今天独自完成了一道复杂的代码题,花费了较长的时间,但最终成功解决了问题。
- 通过这道题,我对算法有了更多的信心,也学到了如何处理矩阵的螺旋填充问题。