题目
解题思路
通过观察规律,我们可以发现数字会先走完最外层再向内一层层递进,并且每一层都分为了四个方向。
left -> right, top -> bottom, left -> right, bottom -> top。为了方便普及规律,特意让每个方向提前停一格,故每个方向我们将会处理同样数量的数字 (0, n-2*layer-1)。此处的-1是因为index = n-1,调整了一下的缘故。
总体思路确定之后,我们再补充每个方向的细节。这部分还是比较好发现规律的(横向行不变,纵向列不变),因为每个方向数字数量相同,我们不必担心loop的range问题。只需要注意index部分需要会根据layer不同有所调整就行。
最后的问题:当n为奇数时,最后一个数的判定会进入外层loop, 但是通过不了任何的内层loop(因为我们提前停一格),所以代码最后要补足一下最中心位置的数。

class Solution:def generateMatrix(self, n: int) -> List[List[int]]:num = 1result = [[0]*n for i in range(n)]for layer in range (0, (n+1)//2):# left -> rightfor ptr in range(0, n-2*layer-1):result[layer][ptr+layer] = numnum += 1# top -> bottomfor ptr in range (0, n-2*layer-1):result[layer+ptr][-1-layer] = numnum += 1# right -> leftfor ptr in range (0, n-2*layer-1):result[n-layer-1][n-ptr-layer-1] = numnum += 1# buttom -> topfor ptr in range (0, n-2*layer-1):result[n-layer-ptr-1][layer] = numnum += 1if n % 2 == 1:layer = (n+1)//2result[layer-1][layer-1] = numreturn result

