螺旋矩阵
1.循环不变量原则
类似于二分法,我们要坚持循环时只是用一个原则,要么是左闭右开,要么是左开右闭,要么是左闭右闭。在循环过程中不能总变化,这样会导致漏判或者重复判断等问题。
2.解法
填充上行从左到右(左闭右开)
填充右列从上到下(左闭右开)
填充下行从右到左(左闭右开)
填充左列从下到上(左闭右开)
最后加一次判断,看n是否为奇数,如果是奇数那么就要在填充一次最中间的位置;如果为偶数,就不需要了。
代码如下:
def generateMatrix(n):
matrix = [[0]*n for _ in range(n)] # 初始化矩阵
left, right, up, down = 0, n-1, 0, n-1 # 控制循环边界
number = 1 # 填充的数字
while left<right and up<down: # 控制边界
# 上面从左到右填充(左闭右开)
for x in range(left,right):
matrix[up][x] = number
number += 1
# 右边从上到下填充(左闭右开)
for x in range(up,down):
matrix[x][right] = number
number += 1
# 下面从右到左填充(左闭右开)
for x in range(right,left,-1):
matrix[down][x] = number
number += 1
# 左边从下到上填充(左闭右开)
for x in range(down,up,-1):
matrix[x][left] = number
number += 1
# 缩小范围
left += 1
right -= 1
up += 1
down -= 1
# 如果n为奇数,额外填充一次中心
if n % 2 != 0:
matrix[n//2][n//2] = number
return matrix
3.总结
python
-
for _ in range(n):其中的_起到的是一个循环标志的作用,也可以用i,j等代替,因为在代码中不需要用到i,j等,所以就直接写成_即可
-
初始化n*n矩阵的方法:
matrix = [[0]*n for _ in range(n)]
算法
- 循环不变量原则
4.相关题目推荐
剑指Offer 29.顺时针打印矩阵