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

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

首页休闲益智收集苹果更新时间:2024-07-31
题目

给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。

通过树上的一条边,需要花费 1 秒钟。

你从节点0出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点 0 。

无向树的边由 edges 给出,其中 edges[i] = [fromi, toi] ,表示有一条边连接 from 和 toi 。

除此以外,还有一个布尔数组 hasApple ,其中 hasApple[i] = true 代表节点 i 有一个苹果,

否则,节点 i 没有苹果。

示例 1:输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]],

hasApple = [false,false,true,false,true,true,false] 输出:8

解释:上图展示了给定的树,其中红色节点表示有苹果。一个能收集到所有苹果的最优方案由绿色箭头表示。

示例 2:输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]],

hasApple = [false,false,true,false,false,true,false] 输出:6

解释:上图展示了给定的树,其中红色节点表示有苹果。一个能收集到所有苹果的最优方案由绿色箭头表示。

示例 3:输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]],

hasApple = [false,false,false,false,false,false,false] 输出:0

提示:1 <= n <= 10^5

edges.length == n-1

edges[i].length == 2

0 <= fromi, toi <= n-1

fromi < toi

hasApple.length == n

解题思路分析

1、深度优先搜索;时间复杂度O(n),空间复杂度O(n)

func minTime(n int, edges [][]int, hasApple []bool) int { arr := make([][]int, n) for i := 0; i < len(edges); i { a, b := edges[i][0], edges[i][1] arr[a] = append(arr[a], b) arr[b] = append(arr[b], a) } visited := make([]bool, n) res, _ := dfs(arr, hasApple, visited, 0) if res >= 2 { return res - 2 // 遍历N个点,长度:2N-2 } return 0 } func dfs(arr [][]int, hasApple, visited []bool, index int) (int, bool) { visited[index] = true res := 0 has := false if hasApple[index] == true { has = true } for i := 0; i < len(arr[index]); i { next := arr[index][i] if visited[next] == true { continue } total, isExist := dfs(arr, hasApple, visited, next) if isExist { has = true res = res total } } if has == true { return res 2, true } return 0, false }

2、遍历;时间复杂度O(n),空间复杂度O(n)

func minTime(n int, edges [][]int, hasApple []bool) int { ans := 0 m := make([]bool, n) m[0] = true for i := 0; i < len(edges); i { from, to := edges[i][0], edges[i][1] if m[from] { m[to] = true } else { m[from] = true // 改变数据 // [[0 2] [0 3] [1 2]] => [[0 2] [0 3] [2 1]] edges[i][0], edges[i][1] = edges[i][1], edges[i][0] } } for i := len(edges) - 1; i >= 0; i-- { from, to := edges[i][0], edges[i][1] if hasApple[to] { hasApple[from] = true ans = 2 } } return ans }总结

Medium题目,可以采用深度优先搜索从0开始遍历

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved