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()
"""
总结

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

相关推荐
和小潘一起学AI10 小时前
CentOS 7安装Anaconda
开发语言·python
kcuwu.10 小时前
Python 正则表达式从入门到实战
数据库·python·正则表达式
不解不惑10 小时前
langchain qwen3 构建一个简单的对话系统
pytorch·python·langchain
努力努力再努力dyx10 小时前
【无标题】
开发语言·python
I疯子11 小时前
2026-04-07 打卡第 4 天
python
数据知道11 小时前
claw-code 源码分析:Tool Pool 组装——默认策略、过滤、MCP 开关如何影响「可用工具面」?
python·claude code·claw code
Zzj_tju11 小时前
Java 从入门到精通(十二):File 与 IO 流基础,为什么程序“读写文件”时总是容易出问题?
java·python·php
汽车搬砖家11 小时前
vSOMEIP系列 -6: vsomeip python版部署,双机跨域通信(vsomeip - davinci AP someip)
python·汽车
小陈工11 小时前
Python Web开发入门(十六):前后端分离架构设计——从“各自为政”到“高效协同”
开发语言·前端·数据库·人工智能·python
样例过了就是过了11 小时前
LeetCode热题100 爬楼梯
c++·算法·leetcode·动态规划