This theme is built with|

月念尘

园龄:3年粉丝:0关注:3

2022-10-23 12:52阅读: 300评论: 0推荐: 0

螺旋矩阵

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 中国大陆许可协议进行许可。

posted @   月念尘  阅读(300)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起