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

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

相关推荐
玛丽莲茼蒿1 小时前
Leetcode hot100 每日温度【中等】
算法·leetcode·职场和发展
芝士就是力量啊 ೄ೨1 小时前
Python如何编写一个简单的类
开发语言·python
样例过了就是过了1 小时前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
胖虎喜欢静香1 小时前
从零到一快速实现 Mini DeepResearch
人工智能·python·开源
HLJ洛神千羽1 小时前
电脑右下角显示【周几或星期几】和【上下午】方法
windows
qq_392690661 小时前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
ITHAOGE151 小时前
下载 | Windows Server 2025官方原版ISO映像!(4月更新、标准版、数据中心版、26100.32690)
服务器·windows·科技·微软·电脑
Muyuan19982 小时前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
北顾笙9802 小时前
day38-数据结构力扣
数据结构·算法·leetcode
程序员-小李2 小时前
uv 学习总结:从零到一掌握现代化 Python 工具链
python·学习·uv