力扣59-螺旋矩阵 II

原题 https://leetcode-cn.com/problems/spiral-matrix-ii/

这道题目为 这道题目的升级款版本

https://www.cnblogs.com/wang102030/p/14539838.html

可以沿用上道题目的逆方向思考。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        if n == 0:
            return []
        if n == 1:
            return [[1]]   
        matrix = list(range(1,n**2+1))
        new_matrix = [[0 for _ in range(0,n)] for _ in range(0,n)]
        x,y = 0,0
        M,N = len(new_matrix),len(new_matrix[0]) 
        dirs = [(0,1),(1,0),(0,-1),(-1,0)]
        left,right,up,dowm = 0,N-1,0,M-1 
        cur_d = 0
        for num in  matrix:
            new_matrix[x][y] = num
            if cur_d == 0 and y == right:
                cur_d += 1
                up += 1
            elif cur_d == 1 and x == dowm:
                cur_d += 1
                right -= 1
            elif cur_d == 2 and y == left:
                cur_d += 1
                dowm -= 1
            elif cur_d == 3 and x == up:
                 cur_d += 1
                 left += 1
            cur_d %= 4
            x += dirs[cur_d][0]
            y += dirs[cur_d][1]
        return new_matrix

  

  个人理解 : 对于这种问题的思考就是,可以一步一步走,碰到边界转化方向。通过 dirs 管理方向 右 下 左 上

  边界:下一步坐标小于零或者出了原始矩阵最大值或者是一个非零数字则转化方向。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        dirs = [(0,1),(1,0),(0,-1),(-1,0)]
        count = 0
        car_d = 0 
        x, y =0,0
        res = [[0] * n for _ in range(n) ]
        while count != n ** 2:
            count += 1
            res[x][y] = count 
            dx,dy = dirs[car_d][0],dirs[car_d][1]
            newx,newy = x + dx,y +dy # 下一步
            # 如果下一步到了边界 转化方向
            # 边界定义出了矩阵, 喷到到非零的数字
            if newx<0 or newx>= n or newy < 0 or newy >=n or res[newx][newy] != 0:
                 car_d = (car_d+1) % 4 
                 dx , dy = dirs[car_d][0],dirs[car_d][1]
            x ,y = x +dx,y+dy
        return res

  

 

posted @ 2021-03-16 20:38  睡觉了嘛  阅读(49)  评论(0编辑  收藏  举报