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

发布于:2025-05-20 ⋅ 阅读:(15) ⋅ 点赞:(0)
题目

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

思路

先获取列表,上下左右的所有情况。解决一维的问题
然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索)
然后使用递归,进行累加

代码
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()
"""

总结

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


网站公告

今日签到

点亮在社区的每一天
去签到