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

posted @ 2020-03-24 22:12  风不再来  阅读(391)  评论(0编辑  收藏  举报