螺旋矩阵

1、l,r,t,b分别表示整个矩阵的边界:(n是传入的整数值)

l, r, t, b = 0, n - 1, 0, n - 1

2、先生成一个n*n的空矩阵,内部值用0填充:

mat = [[0 for _ in range(n)] for _ in range(n)]  # 生成空矩阵

3、以num<=tar为迭代条件,模拟矩阵进行循环赋值(tar为n*n)

        while num <= tar:
            for i in range(l, r + 1):  # left to right
                mat[t][i] = num
                num += 1
            t += 1
            for i in range(t, b + 1):  # top to bottom
                mat[i][r] = num
                num += 1
            r -= 1
            for i in range(r, l - 1, -1):  # right to left
                mat[b][i] = num
                num += 1
            b -= 1
            for i in range(b, t - 1, -1):  # bottom to top
                mat[i][l] = num
                num += 1
            l += 1

4、完整代码:

class Solution:
    def generateMatrix(self, n: int) -> [[int]]:
        l, r, t, b = 0, n - 1, 0, n - 1
        mat = [[0 for _ in range(n)] for _ in range(n)]  # 生成空矩阵
        print(mat)
        num, tar = 1, n * n
        while num <= tar:
            for i in range(l, r + 1):  # left to right
                mat[t][i] = num
                num += 1
            t += 1
            for i in range(t, b + 1):  # top to bottom
                mat[i][r] = num
                num += 1
            r -= 1
            for i in range(r, l - 1, -1):  # right to left
                mat[b][i] = num
                num += 1
            b -= 1
            for i in range(b, t - 1, -1):  # bottom to top
                mat[i][l] = num
                num += 1
            l += 1
        return mat


s = Solution()
print("\033[31m[+]\033[0m\033[45m", s.generateMatrix(3), "\033[0m")
print("""
\033[34m思路:
先生成一个n*n的空矩阵mat,随后模拟整个环绕的过程填入值.
num <= tar 作为迭代条件可以解决当n为奇数,矩阵中心数无法在迭代过程中填充的问题
\033[0m
""")

 

5、另一种思路:

from typing import List

class Solution2:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)]
        startx, starty = 0, 0  # 起始点
        loop, mid = n // 2, n // 2  # 迭代次数、n为奇数时,矩阵的中心点
        count = 1  # 计数

        for offset in range(1, loop + 1):  # 每循环一层偏移量加1,偏移量从1开始
            for i in range(starty, n - offset):  # 从左至右,左闭右开
                nums[startx][i] = count
                count += 1
            for i in range(startx, n - offset):  # 从上至下
                nums[i][n - offset] = count
                count += 1
            for i in range(n - offset, starty, -1):  # 从右至左
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, startx, -1):  # 从下至上
                nums[i][starty] = count
                count += 1
            startx += 1  # 更新起始点
            starty += 1

        if n % 2 != 0:  # n为奇数时,填充中心点
            nums[mid][mid] = count
        return nums


s2 = Solution2()
print("\033[31m[+]\033[0m\033[45m", s2.generateMatrix(3), "\033[0m")
print("""
\033[35m首先是外层循环,之后更新起始点,依次进行循环,若是奇数,单独给中心的位置赋值,
赋值前count已经是中心位置的值了,只是没有继续循环,所以没有赋值给中心位置\033[0m
""")

 

posted @ 2022-10-23 12:52  月念尘  阅读(316)  评论(0)    收藏  举报