leetcode.螺旋矩阵54/59

lc.54

1、计算turns

2、注意边界,我采用【 )

3、offset很妙!

4、奇、偶注意最后填充情况

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        #[ ) 
        res = [[0] * n for _ in range(n)]
        turns = n // 2
        count = 1
        start_x = 0
        start_y = 0
        offset = 1
        while turns:
            i = start_x
            j = start_y
            while j < n - offset:
                res[i][j] = count
                count += 1
                j += 1
            while i < n - offset:
                res[i][j] = count
                count += 1
                i += 1
            while j >= offset:
                res[i][j] = count
                count += 1
                j -= 1
            while i >= offset:
                res[i][j] = count
                count += 1
                i -= 1
            turns -= 1
            offset += 1
            start_x += 1
            start_y += 1
        if n % 2 == 1:
            res[n//2][n//2] = count
        return res

lc.59——lc54的通用版本

1、turns其实由min(m,n)决定

2、最后的填充也由min(m, n)决定

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        m = len(matrix)
        n = len(matrix[0])
        res = []
        start_x = 0
        start_y = 0
        offset = 1
        turns = min(m, n) // 2
        while turns:
            i = start_x
            j = start_y
            while j < n - offset:
                res.append(matrix[i][j])
                j += 1
            while i < m - offset:
                res.append(matrix[i][j])
                i += 1
            while j >= offset:
                res.append(matrix[i][j])
                j -= 1
            while i >= offset:
                res.append(matrix[i][j])
                i -= 1
            turns -= 1    
            offset += 1
            start_x += 1
            start_y += 1
        if min(m, n) % 2 == 1:
            if m <= n:
                for j in range(start_y, n - start_y):
                    res.append(matrix[start_x][j])
            else:
                for i in range(start_x, m - start_x):
                    res.append(matrix[i][start_y])
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值