如何基于python实现不邻接植花

 更新时间:2020年05月01日 13:17:02   作者:云上男孩  
这篇文章主要介绍了如何基于python实现不邻接植花,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

有 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 条或者更多路径可以进入或离开。
保证存在答案。

知识准备

在python中可以使用列表作为队列,list用append添加元素

可以用字典来存储邻接节点nei = {}

在集合中使用for循环

{res[j] for j in G[i]}

集合的pop函数

flowers = {1,2,3,4} #集合直接相减即可
flowers.pop()
# 集合不能获取某个元素这样子的操作
print(flowers)

out: {2,3,4}集合中的pop是从左边开始取

集合的相减

flowers = {1,2,3,4}
h = {0}
flowers-h

out:{1,2,3,4}

我的题解

题解1

 
 class Solution:
   # 整体思路采用BFS方法,还需考虑不连通图的问题,然后着手结果唯一
   def gardenNoAdj(self, N: int, paths: List[List[int]]) -> List[int]:
     #构建一个answer数组
     answer = [0 for _ in range(N)]
     #构建所有节点
     all_nodes = []
     [all_nodes.append(i) for i in range(1,N+1)]
     #构建visted列表
     visted = dict.fromkeys(all_nodes, 0)
     #初始化nei字典元素为空列表
     nei = [[] for _ in range(N)]
     # 构建无向邻接表,无邻居则不构建
     for path in paths:
       nei[path[0]-1].append(path[1])
       nei[path[1]-1].append(path[0])
     #遍历每一个点,每个点保证自己邻接点不是和自己相同就行
     answer[0] = 1 
     for node in range(1,N+1):  #遍历所有节点
       visted[node] = 1
       fix = set()
       if(answer[node-1]==0): #如果为0,说明不是连通图
         answer[node-1] = 1 
       flowers=[1,2,3,4]
       nei[node-1] = sorted(nei[node-1]) #排序邻居节点
       flowers.pop(answer[node-1]-1) #弹出父节点的flowers
       for sinode in nei[node-1]: #遍历邻居
         if(visted[sinode] == 0): #如果邻居未被访问过
           answer[sinode-1] = flowers[0] #使用1,弹出1
           flowers.pop(0)
         else: #如果邻居被访问过
           if(answer[sinode-1]==answer[node-1]):
             answer[node-1] = flowers[0] 
             flowers.pop(0) 
           fix.add(answer[sinode-1])
       if not fix:
         continue
       else:
         flowers=[1,2,3,4]
         for a_val in list(fix):
           flowers.remove(a_val)
         answer[node-1] = flowers[0]
             
     return answer
 

简化方法:利用集合快速搞定

class Solution:
  def gardenNoAdj(self, N: int, paths: List[List[int]]) -> List[int]:
   #构建一个answer数组
    answer = [0]*N
    #初始化nei字典元素为空列表
    nei = [[] for _ in range(N)]
    # 构建无向邻接表,无邻居则不构建
    for path in paths:
      nei[path[0]-1].append(path[1])
      nei[path[1]-1].append(path[0])
    for node in range(1,N+1):  #遍历所有节点
      flowers={1,2,3,4}
      #临时存储邻居含有的花类型
      a = set()
      for sinode in nei[node-1]: #遍历邻居
        a.add(answer[sinode-1])
      flowers = flowers - a 
      answer[node-1] = flowers.pop()
                
    return answer

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python之pyinstaller组件打包命令和异常解析实战

    python之pyinstaller组件打包命令和异常解析实战

    前段时间在制作小工具的时候,直接在命令行用pyinstaller工具打包成功后,启动exe可执行文件的时候各种报错, 今天,我们就分享一下踩坑经过,需要的朋友可以参考下
    2021-09-09
  • Python的Django框架中设置日期和字段可选的方法

    Python的Django框架中设置日期和字段可选的方法

    这篇文章主要介绍了Python的Django框架中设置日期和字段可选的方法,是Django设置当中的基本操作,需要的朋友可以参考下
    2015-07-07
  • Python中Celery异步任务队列的具体使用

    Python中Celery异步任务队列的具体使用

    Celery是一个用于处理分布式任务和作业队列的异步任务队列库,本文主要介绍了Python中Celery异步任务队列的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • python获取文件版本信息、公司名和产品名的方法

    python获取文件版本信息、公司名和产品名的方法

    这篇文章主要介绍了python获取文件版本信息、公司名和产品名的方法,是Python程序设计中非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • 跟老齐学Python之list和str比较

    跟老齐学Python之list和str比较

    list和str两种类型数据,有不少相似的地方,也有很大的区别。本讲对她们做个简要比较,同时也是对前面有关两者的知识复习一下,所谓“温故而知新”。
    2014-09-09
  • python 爬取英雄联盟皮肤并下载的示例

    python 爬取英雄联盟皮肤并下载的示例

    这篇文章主要介绍了python 爬取英雄联盟皮肤并下载的示例,帮助大家更好的理解和学习使用python 爬虫,感兴趣的朋友可以聊继续
    2020-12-12
  • Python中字典的基础介绍及常用操作总结

    Python中字典的基础介绍及常用操作总结

    字典也是python的数据类型中的一种,它由许多键值对组成,它是一种可变容器模型,一般情况下键是唯一的,字典支持嵌套,下面这篇文章主要给大家介绍了关于Python中字典的基础介绍及常用操作,需要的朋友可以参考下
    2021-09-09
  • Python四大金刚之元组详解

    Python四大金刚之元组详解

    这篇文章主要介绍了Python的元组,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • Pytest测试报告工具Allure的高级用法

    Pytest测试报告工具Allure的高级用法

    这篇文章介绍了Pytest测试报告工具Allure的高级用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • python识别图片中指定颜色的图案并保存为图片

    python识别图片中指定颜色的图案并保存为图片

    本文介绍了如何使用Python识别图片中的指定颜色图案,并将识别结果保存为图片,通过示例代码和效果展示,可以学习到实现这一功能的具体方法,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论