重新回看这道题还是不会!所以又好好的再次学习了一遍。
题目要求:根据输入的数字n,生成n^2的二维数组,并顺时针转圈存储数据,输出这个矩阵。
Solving tips:
- 确定边界:每条边都是左闭右开,[ ),即如下图所示,每条边分别一个循环实现。

- 确定圈数:可以先思考一下:一个边长为n的正方形矩阵,每次转完一圈,向内收缩时,边长收缩为
(因为左右两端都已经循环过了所以在原来的边长长度减二);当再转完这个圈,再向内时,边长再度收缩为
;以此类推。所以需要转几圈就是求n这个数包含几个2!!所以就是通过 n//2来实现。当n为偶数,这个圈数就是n//2;当n为奇数,需要转的完整圈数也是n//2,但是最后一个数字在矩阵最中心,所以也就是(n//2)+1,因为左闭右开,所以最后+1取不到,要单独赋值,但是又能满足其他所有的完整的圈儿。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
goal = 1
start_x, start_y = 0, 0
nums = [[0] * n for _ in range(n)] # 生成一个全是0的n*n的矩阵
offset = 1
for loop in range(1, (n // 2) + 1): # 循环几圈
print(loop)
# 从左到右
for j in range(start_y, n - offset):
nums[start_x][j] = goal
goal += 1
# 从上到下
for i in range(start_x, n - offset):
nums[i][n - offset] = goal
goal += 1
# 从右到左
for j in range(n - offset, start_y, -1):
nums[n - offset][j] = goal
goal += 1
# 从下到上
for i in range(n - offset, start_x, -1):
nums[i][start_y] = goal
goal += 1
# 换圈&边界值
start_x += 1
start_y += 1
offset += 1
# 中心赋值
if n % 2 == 1:
nums[start_x][start_y] = goal
return nums
2016

被折叠的 条评论
为什么被折叠?



