769. 螺旋矩阵(经典)
769. 螺旋矩阵
中文English
给出整数 n
, 返回一个大小为 n * n
的螺旋矩阵
样例
样例 1:
输入 : n = 3
输出 :
[
[1,2,3]
[8,9,4]
[7,6,5]
]
样例 2:
输入 : n = 5
输出 :
[
[1,2,3,4,5]
[16,17,18,19,6]
[15,24,25,20,7]
[14,23,22,21,8]
[13,12,11,10,9]
]
class Solution: ''' 大致思路: 1.给出初始值dic=[[0,0,0],...],p=r,x=0,y=0 2.有4个临界值,这4个临界值会随着走的过程发生变化。分别为x_l,x_r,y_u,y_d,值分别是0,n-1,1,n-1 (特别注意,有一个临界值y_u=1,因为最开始从[0][0]出发,占了一位) 2.p为走的方向,r,d,l,u。如果p==r的时候,x不变,y+1,直到y==临界值时候(此时需要转换方向),p赋值为d。其他一样按此情况赋值,和走 3.然后最后的时候对dic赋值dic[x][y]=num,返回 注意:x_l,x_r,y_u,y_d分别为x轴左右临界值,y轴上下临界值。r,d,l,u分别代表走的方向为右,下,左,上。 ''' def spiralArray(self,n): ##初始化 dic,p,x,y=[],'r',0,0 #特别注意对dic的初始化,早先开始就知道有列表的长度,所以都已经赋好了初始值0,每走一步就赋新值。 for i in range(n): dic.append([0]*n) #给定初始临界x和临界y,每次走到临界,临界x和临界y都会发生变化(注意,y_u初始为1,因为开始的位置从[0][0]开始,本身就占了一位,所以往上临界值应该为1就停) x_l,x_r,y_u,y_d = 0,n-1,1,n-1 for num in range(1,n*n+1): dic[x][y]=num #向右边走,x不变,y+1 if p == 'r' and y < x_r: y += 1 #如果到临界值的话,p改变方向 if y == x_r: x_r = x_r - 1 p = 'd' elif p == 'd' and x < y_d: x += 1 if x == y_d: y_d = y_d - 1 p = 'l' elif p == 'l' and y > x_l: y -= 1 if y == x_l: x_l = x_l + 1 p = 'u' elif p == 'u' and x > y_u: x -= 1 if x == y_u: y_u = y_u + 1 p = 'r' return dic