leetcode 每日一题 1931. 用三种不同颜色为网格涂色

题目

1931. 用三种不同颜色为网格涂色

思路

先获取列表,上下左右的所有情况。解决一维的问题

然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索)

然后使用递归,进行累加

代码
python 复制代码
from collections import defaultdict


# 用java的思维写的
class Solution(object):
    def colorTheGrid(self, m, n):
        mod = 10 ** 9 + 7
        # 初始化字典
        valid = dict()
        # 枚举一行中所有可能的值 3的m次方
        for mask in range(3 ** m):
            # 初始化一个list  list存放的是具体的color,用于前后值的比较
            # mask和list是相互对应的
            color = list()
            tmp = mask
            for i in range(m):
                color.append(tmp % 3)
                tmp = tmp // 3  # 需要的是返回整数
            # 对color的各项进行校验
            flag = False
            for i in range(m - 1):
                if color[i] == color[i + 1]:
                    flag = True
                    break
            if not flag:
                valid[mask] = color
        # 需要预处理,上下两行的对应关系,key和list的结构
        # 遍历所有valid中的数值
        adjacent = dict()
        for key1, value1 in valid.items():
            adjacent_list = list()
            for key2, value2 in valid.items():
                # 需要遍历上下是否会冲突
                flag = False
                for x, y in zip(value1, value2):
                    if x == y:
                        flag = True
                if not flag:
                    adjacent_list.append(key2)
            adjacent[key1] = adjacent_list
        f = dict()
        g = dict()
        for key1, _ in valid.items():
            f[key1] = 1
        for i in range(1, n):
            g = dict()  # 这里需要清空数据
            for mask1 in valid.keys():
                for mask2 in adjacent[mask1]:
                    # g[mask1] 如果取不到会报错
                    if mask1 in g:
                        g[mask1] += f[mask2]
                    else:
                        g[mask1] = f[mask2]
                    if g[mask1] >= mod:
                        g[mask1] -= mod
            f = g
        sum = 0
        for v1, v2 in f.items():
            sum += v2
        return sum % mod


# 用python的语法糖写
def colorTheGrid2(self, m, n):
    mod = 10 ** 9 + 7
    # 初始化字典
    valid = dict()
    # 枚举一行中所有可能的值 3的m次方
    for mask in range(3 ** m):
        # 初始化一个list  list存放的是具体的color,用于前后值的比较
        # mask和list是相互对应的
        color = list()
        tmp = mask
        for i in range(m):
            color.append(tmp % 3)
            tmp = tmp // 3  # 需要的是返回整数
        if any(color[i] == color[i + 1] for i in range(m - 1)):
            continue
        valid[mask] = color
    # 需要预处理,上下两行的对应关系,key和list的结构
    # 遍历所有valid中的数值
    adjacent = defaultdict(list)
    for key1, value1 in valid.items():
        for key2, value2 in valid.items():
            if not any(x == y for x, y in zip(value1, value2)):
                adjacent[key1].append(key2)
    f = defaultdict(int)
    for key1, _ in valid.items():
        f[key1] += 1
    for i in range(1, n):
        g = defaultdict(int)
        for mask1 in valid.keys():
            for mask2 in adjacent[mask1]:
                g[mask1] += f[mask2]
                g[mask1] = g[mask1] % mod
        f = g
    return sum(f.values()) % mod


solution = Solution()
ans = solution.colorTheGrid(1, 1)
print(ans)
ans = solution.colorTheGrid(1, 2)
print(ans)
ans = solution.colorTheGrid(5, 5)
print(ans)

ans = colorTheGrid2(None, 5, 5)
print(ans)

dic = defaultdict(list)
dic["a"].append("11")
print(dic)  # defaultdict(<class 'list'>, {'a': ['11']})

dict2 = dict()
value = list()
value.append("11")
dict2["a"] = value
print(dict2)  # {'a': ['11']}

my_list = [5, 8, 12, 3, 7]
my_list2 = [my_list[i] * 2 for i in range(len(my_list))]
print(my_list2)

"""
None相当于null
if not flag: 相当于!flag
adjacent[key1] = adjacent_list  相当于adjacent.put(key1,adjacent_list)  hashmap用法

if mask1 in g:
    g[mask1] += f[mask2]    这里取值之前还需要进行key不在map(dict)的判断
    
my_list = [5, 8, 12, 3, 7]
长度 len(my_list)  如果是java my_list.length()或者是my_list.size()

python有if any的写法
my_list = [5, 8, 12, 3, 7]
result = False
for num in my_list:
    if num > 10:
        result = True
        break
        
result = any(num > 10 for num in my_list)


python 还有all的语法糖
my_list = [6, 8, 7, 9]
result = True
for num in my_list:
    if num <= 5:
        result = False
        break
result = all(num > 5 for num in my_list)

这里直接初始化值

dic = defaultdict(list)
dic["a"].append("11")
print(dic)  # defaultdict(<class 'list'>, {'a': ['11']})

dict2 = dict()
value = list()
value.append("11")
dict2["a"] = value
print(dict2)  # {'a': ['11']}


my_list = [5, 8, 12, 3, 7]
my_list2 = [my_list[i] * 2 for i in range(len(my_list))]
print(my_list2)
这个就像是java的流式处理,只是处理的逻辑前置了


f = dict()
可以有四种方法
f.keys()
f.values()
f.items()
"""
总结

这里对于数据的处理上比较考验细节

相关推荐
LeonDL16814 分钟前
YOLOv8 在单片机上的几种部署方案
人工智能·python·单片机·嵌入式硬件·深度学习·yolo·yolov8 在单片机上的部署
LeonDL16816 分钟前
YOLOv8 在单片机上部署的缺点和应对方案
python·单片机·嵌入式硬件·深度学习·yolo·yolov8在单片机上的缺点·yolov8 在单片机上的优化
卧式纯绿19 分钟前
卷积神经网络基础(九)
人工智能·python·深度学习·神经网络·机器学习·cnn
yorushika_23 分钟前
python打卡训练营打卡记录day30
开发语言·python
闭月之泪舞24 分钟前
初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
python·算法·机器学习
LetsonH1 小时前
Pyro:基于PyTorch的概率编程框架
人工智能·pytorch·python
文莉wenliii1 小时前
打卡day30
开发语言·python
哪 吒1 小时前
2025B卷 - 华为OD机试七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
大数据魔法师1 小时前
Neo4j(一) - Neo4j安装教程(Windows)
windows·neo4j
亿牛云爬虫专家1 小时前
Playwright 多语言一体化——Python_Java_.NET 全栈采集实战
java·python·c#·汽车·.net·playwright·dongchedi.com