本来想着根据上一篇文章中大佬的思路来顺时针转转来改代码,想了一天没搞出来
http://t.csdnimg.cn/7sM8g
于是看了代码随想录的视频
一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
总结一下:
模拟的思路,每一圈中,模拟每条边,发现只需要左闭右开,4个循环就能分别完成一圈的模拟,然后调整出发的位置,以及终点的位置就能实现完成
圈数:n/2(这个时候需要对奇数情况,剩下中间一个元素进行处理,所以我们做一个判断并处理即可。
核心难点:并不是对1~n^2进行切块,而是对矩阵的元素进行赋值
上代码:
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
start_x=0
start_y=0
#offset代表每一圈中终点需要前移的位置数
offset=1
#初始化为1,因为后面可能n=1不会进入循环
matrix=[[1 for _ in range(n)] for _ in range(n)]
#count代表给出的数
count=1
for t in range(n/2):
i=start_x
j=start_y
#第1条边
for j in range(start_y,n-offset):
matrix[i][j]=count
count+=1
j+=1
#第2条边
for i in range(start_x,n-offset):
matrix[i][j]=count
count+=1
i+=1
#第3条边
for j in range(n-offset,start_y,-1):
matrix[i][j]=count
count+=1
j-=1
#第4条边
for i in range(n-offset,start_x,-1):
matrix[i][j]=count
count+=1
#圈数变化
offset+=1
start_x+=1
start_y+=1
#n为奇数的判断
if n%2==1:
j+=1
matrix[i][j]=count
return matrix
#python有点不一样就是for i in range(a,b)后,i不会等于b,而是等于b-1
能跑就行