给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
注意:
1、一定要确定好循环的边界,且每个一层的循环采取 取相同边界的方法
2、将矩阵直接看作一个二维数组就可以了
解题思路:
1、将矩阵分为 上、右、下、左 这四条边,边界值取到倒数第二个元素,倒数第一个元素取不到,上、右、下、左都采取相同的取边界方法,避免重复取,又能取完每一个元素。
2、用一个循环嵌套,外层循环控制需要螺旋多少圈,n//2得,如果是奇数的情况,中间的值则单独填写上就可以了
完整代码:
class Solution:
def generateMarix(n):
# 创建 n*n 的 0 矩阵
nums = [[0]*n for _ in range(n)]
# 起始位置
stratx = 0,starty = 0
loop,mid = n//2,n//2
count = 1
for offset in range(1,loop+1):
# ——
# 上 行不变,列发生变化
for i in range(starty,n-offset):
nums[startx][i] = count
count += 1
# |
# 右 在 上变化的基础上,列不变,行不变
for i in range(startx,n-offset):
nums[i][starty] = count
count += 1
# __
# 下 在 右变化的基础上,行是n-offset那行,列变化
for i in range(n-offset,starty,-1):
nums[n-offset][i] = count
count += 1
# |
# 左 在 下变换的基础上,列是n-offset这列,行变换
for i in range(n-offset,startx,-1):
nums[i][n-offset] = count
count += 1
# 下一个螺旋循环
startx += 1
starty += 1
# 如果是 奇数,就将 它添加到中间的位置
if n % 2 == 1:
nums[mid][mid] = count
return nums