DFS_medium_5406_收集树上所有苹果的最少时间

题目描述

在这里插入图片描述

思路

方法一:DFS

def minTime(n: int, edges: List[List[int]], hasApple: List[bool]) -> int:
  data_dict = {}
  for i in range(n):
    data_dict[i] = []
  for one in edges:
    data_dict[one[0]].append(one[1])
  
  # print(data_dict)
  def dfs(i):
    key = hasApple[i]
    for index in data_dict[i]:
      key |= dfs(index)
    if not key:
      del data_dict[i]
    return key

  dfs(0)
  # print(data_dict)
  return max(0, 2*(len(data_dict) - 1))
class Solution:
    def minTime(self, n: int, edges: List[List[int]], hasApple: List[bool]) -> int:
        data_dict = {}
        for one in edges:
            if one[0] in data_dict:
                data_dict[one[0]].append(one[1])
            else:
                data_dict[one[0]] = [one[1]]
        # dfs
        def dfs(i):
            cnt = 0
            if i in data_dict:
                for child in data_dict[i]:
                    tmp = dfs(child)
                    cnt += tmp
                    # 如果此孩子节点为True(苹果)或者 该节点的孩子节点统计的数量不为0(有苹果)
                    if hasApple[child] or tmp:  
                        cnt += 2
            return cnt
        return dfs(0)

方法二:类似于Union-Find方法

  • 层层向上统计父节点,并用 hash set 存储,用来去重。
class Solution:
    def minTime(self, n: int, edges: List[List[int]], hasApple: List[bool]) -> int:
        data_dict = {}
        for one in edges:
          data_dict[one[1]] = one[0]
        
        print(data_dict)
        cnt = 0
        father_node = set()
        for index, ele in enumerate(hasApple):
          if ele:
            while index not in father_node and index in data_dict:
              cnt += 2
              father_node.add(index)
              index = data_dict[index]
        return cnt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值