螺旋矩阵模板题
固定参数:
n行, m列
dx, dy 分别代表4个方向: 先往右,然后往下 ---- 往左 ---- 往上
x是纵向,y是横向
x, y, di 初始化为0
思路+模板:
判断下一个点 x_next, y_next,合不合法
1: 必须不越界
2:这个点没走过
如果不合法:转向
0 1 2 3 --> 0 1 2 3 循环
( 3 + 1) % 4 = 0
(0 + 1) % 4 = 1
(1 + 1) % 4 = 2
(2 + 1) % 4 = 3
class Solution(object):
def spiralOrder(self, matrix):
if not matrix:
return []
n, m = len(matrix), len(matrix[0])
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = di = 0
res = []
seen = [[False] * m for _ in range(n)]
for i in range(n * m):
res.append(matrix[x][y])
seen[x][y] = True
#下一个点
x_next, y_next = x + dx[di], y + dy[di]
#判断下一个点 没有出界,没有见过
if 0 <= x_next < n and 0 <= y_next < m and not seen[x_next][y_next]:
x, y = x_next, y_next
else:
di = (di + 1) % 4
x, y = x + dx[di], y + dy[di]
return res
可以看出,基本一样
class Solution(object):
def generateMatrix(self, n):
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = di = 0
nums = [i for i in range(1, n ** 2 + 1)]
matrix = [[-1] * n for _ in range(n)]
for i in range(n ** 2):
matrix[x][y] = nums[i]
#下一个点
x_next, y_next = x + dx[di], y + dy[di]
#判断下一个点 没有出界,没有见过
if 0 <= x_next < n and 0 <= y_next < n and matrix[x_next][y_next] == -1:
x, y = x_next, y_next
else:
di = (di + 1) % 4
x, y = x + dx[di], y + dy[di]
return matrix
注意笔试中的输入和输出,思路基本没有变化
def main():
n, m = map(int, input().split())
matrix = [[-1] * m for _ in range(n)]
nums = [i for i in range(1, n * m + 1)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
x = y = di = 0
for i in range(n * m):
matrix[x][y] = nums[i]
x_next, y_next = x + dx[di], y + dy[di]
if 0 <= x_next < n and 0 <= y_next < m and matrix[x_next][y_next] == -1:
x, y = x_next, y_next
else:
di = (di + 1) % 4
x, y = x + dx[di], y + dy[di]
for row in matrix:
for i in row:
print(i, end = ' ')
print()
main()
换汤不换药:
滴滴笔试: 用斐波那契数列填充矩阵
一个蛇形迂回的斐波那契数列,它是一个n*n的矩阵,在上面的矩阵中n=3。第1行第1列是最大值,然后按照顺时针的次序数字逐渐变小
样例输入
3
样例输出
34 21 13
1 1 8
2 3 5
nums先搞成是一个斐波那契数列, 然后直接进行一个模板的使用
def getfib(n):
length = n * n
f = [1] * length
for i in range(2, length):
f[i] = f[i - 1] + f[i - 2]
f.reverse()
return f
米哈游笔试:从A-Z 循环填充矩阵
nums[i %26] 即可