给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
注意:统一原则:左闭右开
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
r = [[0]*n for _ in range(n)]
loop, mid = n//2, n//2
count = 1
for i in range(0,loop):
for j in range(i, n-i-1):
r[i][j] = count
count += 1
for j in range(i, n-i-1):
r[j][n-i-1] = count
count += 1
for j in range(n-i-1, i, -1):
r[n-i-1][j] = count
count += 1
for j in range(n-i-1, i, -1):
r[j][i] = count
count += 1
if n%2 == 1:
r[loop][loop] = n**2
return r
注意:
一开始写错了一个地方,for j in range(i, n-i-1), 少写了后面的减1. 一定要特别注意。
这道题关键是自己在纸上画图,把逻辑搞清楚。乍一看好像很复杂,其实把逻辑弄清楚以后,就不难了。
手写讲解过程:
重新写了一遍,这个代码看上去和之前的一样,但是报错了
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
r = [[0] * n for _ in range(n)]
loop, mid = n//2, n//2
count = 1
for i in range(loop):
for j in range(i,n-i-1):
r[i][j] = count
count += 1
for j in range(i,n-i-1):
r[j][n-i-1] = count
count += 1
for j in range(n-i-1, i, -1):
r[n-i-1][j] = count
count += 1
for j in range(n-i-1, i, -1):
r[i][j] = count
count += 1
if n%2 == 1:
r[mid][mid] = n**2
return r
Input
n =
3
Output
[[1,8,7],[0,9,4],[0,6,5]]
Expected
[[1,2,3],[8,9,4],[7,6,5]]
我找到问题所在了,是最后一个for loop里面,应该是r[j][i] = count, 而不是r[i][j],看来一定要小心谨慎地思考啊,一定要认真思考每一个细节。
不过这个代码挺顺畅地写下来了,只有一个小错误,小细节。还是表扬一下自己。