一入循环深似海,代码随想录螺旋矩阵二刷

代码随想录螺旋矩阵二刷

leetcode59

在这里插入图片描述

来看下螺旋矩阵。螺旋矩阵这道题确实很容易写着写着就绕进去了。首先读下题。给出正整数n,生成n*n的矩阵。
我们来看其中一个用例,完成一个圈是需要四个循环去填充。但是四条边填充的时候要始终保持一样的规则,比如左闭右开的规则。那么转几圈呢。需要外部一个循环来控制,是不是就是n决定的。也就是n//2.决定循环次数。
具体程序如下:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        startx,starty,count = 0,0,1
        control = n // 2
        result = [[0] * n for _ in range(n)]
        for offset in range(1,control + 1):
            for i in range(starty,n-offset):
                result[startx][i] = count
                count += 1
            for i in range(startx,n-offset):
                result[i][n-offset] = count
                count += 1
            for i in range(n-offset,starty,-1):
                result[n-offset][i] = count
                count += 1
            for i in range(n-offset,startx,-1):
                result[i][starty] = count
                count += 1
            startx += 1
            starty += 1
        if n % 2 == 1:
            result[n // 2][n // 2] = count
        return result

我们需要定义开始填充的x和y坐标。也就是行开始坐标和列开始坐标。并且由于我们遍历的终点是取不到的,并且这个位置是跟你在第几圈循环是有关系的。所以外层循环变量定义为offset,内层循环遍历的终点就为n-offset。
内层第一次循环:行坐标不变,列坐标改变,所以定义范围(starty,n-offset)。
第二次循环,列不变,行发生变化。所以定义范围(startx,n-offset).
同理可得第三次和第四次循环。
完成第一圈后,行列开始坐标都要增加1.
如果n是奇数的话,中间还剩一个单独要填充的。所以需要单独判断并填充。

leetcode54

在这里插入图片描述

这道题是上面那道题的简化版。基本和上面的过程是类似的。

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        startx,starty,= 0,0
        if not matrix or not matrix[0]:
            return []
        m, n = len(matrix), len(matrix[0])
        endx,endy = m,n
        if m == 1 and n == 1:
            return [matrix[0][0]]
        result = []
        control = min(m,n)//2
        for offset in range(control):
            for i  in range(starty,endy-1):
                result.append(matrix[startx][i])
            for i  in range(startx,endx-1):
                result.append(matrix[i][endy-1])
            for i  in range(endy-1,starty,-1):
                result.append(matrix[endx-1][i])
            for i  in range(endx-1,startx,-1):
                result.append(matrix[i][starty]) 
            startx += 1
            starty += 1
            endx -= 1
            endy -= 1

        if startx < endx and starty == endy - 1:
        # 只剩一列,遍历这一列的所有行
            for i in range(startx, endx):
                result.append(matrix[i][starty])
        elif starty < endy and startx == endx - 1:
        # 只剩一行,遍历这一行的所有列
            for i in range(starty, endy):
                result.append(matrix[startx][i])
        return result

这道题由于不是方阵,就稍微麻烦点,这个地方还需要多看看才能熟悉。

posted @ 2024-07-21 21:18  Bathwind_W  阅读(7)  评论(0编辑  收藏  举报