螺旋矩阵系列(蛇形矩阵)

螺旋矩阵模板题

54. 螺旋矩阵
在这里插入图片描述

固定参数:
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

59. 螺旋矩阵 II
在这里插入图片描述

可以看出,基本一样

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

AcWing 756. 蛇形矩阵
在这里插入图片描述

注意笔试中的输入和输出,思路基本没有变化

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] 即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值