题目

WeChata09cec1e8ef6d059c3d0c47556dbc3a9.png

解题思路

通过观察规律,我们可以发现数字会先走完最外层再向内一层层递进,并且每一层都分为了四个方向。
left -> right, top -> bottom, left -> right, bottom -> top。为了方便普及规律,特意让每个方向提前停一格,故每个方向我们将会处理同样数量的数字 (0, n-2*layer-1)。此处的-1是因为index = n-1,调整了一下的缘故。

总体思路确定之后,我们再补充每个方向的细节。这部分还是比较好发现规律的(横向行不变,纵向列不变),因为每个方向数字数量相同,我们不必担心loop的range问题。只需要注意index部分需要会根据layer不同有所调整就行。

最后的问题:当n为奇数时,最后一个数的判定会进入外层loop, 但是通过不了任何的内层loop(因为我们提前停一格),所以代码最后要补足一下最中心位置的数。

WeChatf32b954e88a00b0036625ed8abf8e831.png

  1. class Solution:
  2. def generateMatrix(self, n: int) -> List[List[int]]:
  3. num = 1
  4. result = [[0]*n for i in range(n)]
  5. for layer in range (0, (n+1)//2):
  6. # left -> right
  7. for ptr in range(0, n-2*layer-1):
  8. result[layer][ptr+layer] = num
  9. num += 1
  10. # top -> bottom
  11. for ptr in range (0, n-2*layer-1):
  12. result[layer+ptr][-1-layer] = num
  13. num += 1
  14. # right -> left
  15. for ptr in range (0, n-2*layer-1):
  16. result[n-layer-1][n-ptr-layer-1] = num
  17. num += 1
  18. # buttom -> top
  19. for ptr in range (0, n-2*layer-1):
  20. result[n-layer-ptr-1][layer] = num
  21. num += 1
  22. if n % 2 == 1:
  23. layer = (n+1)//2
  24. result[layer-1][layer-1] = num
  25. return result