59. 螺旋矩阵 II
要点
1. 循环圈数为什么是n//2:
因为搜索一圈之后,下一圈的上边会往下走,下一圈的下边会往上走,高度就少2,下一圈的左边会往右走,下一圈的右边会往左走,相当于宽少2了,每次下一圈都会比上一圈的高度宽度都少2,直到这个没有外圈了,没有外圈就是宽度是和高度都是0的时候(偶数的情况),每次宽,高缩小2,直到宽,高是0。因为宽,高都一样,而且是一起缩2的,那么就当高缩2到0的时候就结束了,要缩多少次,就是圈。高假设是偶数,偶数-2-2-2一直到0,不就是这个偶数除2吗,就是圈数
2. 边界问题:
坚持一个原则,要不左闭右开,要不左闭右闭
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
startx, starty = 0, 0#起始点
loop, mid = n // 2, n // 2#循环圈数,中间点
offset = 1
count=1
c = [[0] * n for i in range(n)]
for a in range(1,loop+1):# 每循环一层偏移量加1,偏移量从1开始
for j in range(starty,n-offset):#从左往右,左闭右开
c[startx][j]=count
count+=1
for i in range(startx,n-offset):#从上到下
c[i][n-offset]=count
count+=1
for j in range(n-offset,startx,-1):#从右往左
c[n-offset][j]=count
count+=1
for i in range(n-offset,starty,-1):#从下往上
c[i][starty]=count
count+=1
startx+=1#更新起始点和偏移量
starty+=1
offset+=1
if n%2!=0:#如果n是奇数,中心点单独赋值
c[mid][mid]=count
return c