螺旋矩阵
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 """)
本文作者:月念尘
本文链接:https://www.cnblogs.com/yncaqy/p/16818377.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步