重启算法训练第四天|59.螺旋矩阵II

重新回看这道题还是不会!所以又好好的再次学习了一遍。

题目要求:根据输入的数字n,生成n^2的二维数组,并顺时针转圈存储数据,输出这个矩阵。

Solving tips:

  • 确定边界:每条边都是左闭右开,[   ),即如下图所示,每条边分别一个循环实现。

  • 确定圈数:可以先思考一下:一个边长为n的正方形矩阵,每次转完一圈,向内收缩时,边长收缩为n_1=n-2(因为左右两端都已经循环过了所以在原来的边长长度减二);当再转完这个圈,再向内时,边长再度收缩为n_2=n_1-2;以此类推。所以需要转几圈就是求n这个数包含几个2!!所以就是通过 n//2来实现。当n为偶数,这个圈数就是n//2;当n为奇数,需要转的完整圈数也是n//2,但是最后一个数字在矩阵最中心,所以也就是(n//2)+1,因为左闭右开,所以最后+1取不到,要单独赋值,但是又能满足其他所有的完整的圈儿
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        goal = 1
        start_x, start_y = 0, 0
        nums = [[0] * n for _ in range(n)]   # 生成一个全是0的n*n的矩阵
        offset = 1
 
        for loop in range(1, (n // 2) + 1):   # 循环几圈
            print(loop)
            # 从左到右
            for j in range(start_y, n - offset):
                nums[start_x][j] = goal
                goal += 1
            
            # 从上到下
            for i in range(start_x, n - offset):
                nums[i][n - offset] = goal
                goal += 1
            
            # 从右到左
            for j in range(n - offset, start_y, -1):
                nums[n - offset][j] = goal
                goal += 1
            
            # 从下到上
            for i in range(n - offset, start_x, -1):
                nums[i][start_y] = goal
                goal += 1
            
            # 换圈&边界值
            start_x += 1
            start_y += 1
            offset += 1
        
        # 中心赋值
        if n % 2 == 1:
            nums[start_x][start_y] = goal
 
        return nums

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值