ICode9

精准搜索请尝试: 精确搜索
首页?>?其他分享> 文章详细

LeetCode - 不邻接植花

2019-09-16 10:56:28??阅读:576??来源: 互联网

标签:paths?每个?示例?res?range?植花?邻接?花园?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:]


标签:paths,每个,示例,res,range,植花,邻接,花园,LeetCode

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有