1、题目描述:
2、实现思路:
直接模拟矩阵的生成。按照要求,初始位置设为矩阵的左上角,初始方向设为向右。若下一步的位置超出矩阵边界,或者是之前访问过的位置,则顺时针旋转,进入下一个方向。如此反复直至填入 n 2 n^2 n2个元素。
我是这么标记的:首先上、下、左、右,各标记一个变量,每循环一圈,左和上加一,而右和下则减一。
注意边界:(1)当n=1时,单独判断;(2)n为奇数时,最中间的一个数要单独填充。
3、代码描述:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
res = [[0 for _ in range(n)] for _ in range(n)]
if n == 1: # 1的情况单独判断
res[0][0] = 1
return res
value = 1 # 要填充的值
left, up = 0, 0
right, low = n-1, n-1
while value <= n**2: # 只要小于等于n^2,则还没填充完
# 从左向右
for i in range(left, right):
res[up][i] = value
value += 1 # 填充完+1
up += 1 # 上层填了一行,需要去掉
# 从上到下
for i in range(up-1, low):
res[i][right] = value
value += 1
right -= 1 # 右边填了一列,需要去掉
# 从右到左
for i in range(right+1, left, -1):
res[low][i] = value
value += 1
low -= 1 # 下边填了一列,需要去掉
# 从下到上
for i in range(low+1, up-1, -1):
res[i][left] = value
value += 1
left += 1 # 左边填了一列,需要去掉
if left == right or up == low: # n为单数的情况(最中间的数需要单独判断)
res[left][up] = value
value += 1
return res