思路:模拟路径
坚持循环不变量原则,在二分查找中,不变量是区间左闭右闭,在本题中,不变量也是区间,在进行上下左右画圈时,都要左闭右开,保持一致。
路径如下:
填充上行,从左到右,左闭右开
填充右行,从上到下,左闭右开
填充底行,从右到左,左闭右开
填充左行,从下到上,左闭右开
从外到内一圈圈画下去
注意:1)当n为奇数时,mid=n//2, 单独填充矩阵中心点res[mid][mid]=3**2
2)偏移量offset,从1开始,到loop+1为止,左闭右开;loop为循环圈数=n//2
3)count变量用来计数
4)二维数组初始化res=[[0]*n for - in range(n)]
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#初始化一个二维数组
res=[ [0]*n for _ in range(n)]
loop=n//2 #循环圈数
mid=n//2 #n是奇数时,矩阵中心点位置
startx,starty=0,0
count=1 #计数
for offset in range(1,loop+1):
#每循环一圈偏移量加1,偏移量从1开始
#上下左右区间都是左闭右开
#从左到右
for i in range(starty,n-offset):
res[startx][i]=count
count+=1
#从上至下
for i in range(startx,n-offset):
res[i][n-offset]=count
count+=1
#从右至左
for i in range(n-offset,starty,-1):
res[n-offset][i]=count
count+=1
#从下至上
for i in range(n-offset,startx,-1):
res[i][starty]=count
count+=1
#更新起始点
startx+=1
starty+=1
#n为奇数时,填充中心点
if n%2 != 0:
res[mid][mid]=count
return res