LeetCode - 不邻接植花

有 N 个花园,按从 1 到 N 标记。在每个花园中,你打算种下四种花之一。
paths[i] = [x, y] 描述了花园 x 到花园 y 的双向路径。
另外,没有花园有 3 条以上的路径可以进入或者离开。
你需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。
以数组形式返回选择的方案作为答案 answer,其中 answer[i] 为在第 (i+1) 个花园中种植的花的种类。花的种类用  1, 2, 3, 4 表示。保证存在答案。

 
示例 1:

输入:N = 3, paths = [[1,2],[2,3],[3,1]]
输出:[1,2,3]
示例 2:

输入:N = 4, paths = [[1,2],[3,4]]
输出:[1,2,1,2]
示例 3:

输入:N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
输出:[1,2,3,4]
 

提示:

1 <= N <= 10000
0 <= paths.size <= 20000
不存在花园有 4 条或者更多路径可以进入或离开。
保证存在答案。

难度 :简单
关键点:共有4种花可种,而每个花园最多只有三条边,这意味着一定有解,且解可有多种。使用贪心算法

感受下Python的优雅和简洁

N = 7
paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4],[5,6],[5,7],[6,7]]

res = [0] * (N + 1)
G = [ [] for _ in  range(N + 1)]

# 使用邻接表存放每个花园与其它花园连接的信息
for x ,y in paths:
    G[x].append(y)
    G[y].append(x)


for i in range(1,N +1):
    ## 关键代码: 
    #1.算出每个花园相领的花园种了哪些花得出
    #2.得出每个花园可种的花有哪些
    #3.任选一种种植 
    res[i] = ({1,2,3,4} - {res[j] for j in G[i]}).pop()

# 结果
print(res[1:]
上一篇:蓝桥杯 门牌制作


下一篇:20202324 2020-2021-2《数据结构与面向对象程序设计》课程总结