生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 題目
給你一棵有 n 個(gè)節(jié)點(diǎn)的無向樹,節(jié)點(diǎn)編號(hào)為 0 到 n-1 ,它們中有一些節(jié)點(diǎn)有蘋果。 通過樹上的一條邊,需要花費(fèi) 1 秒鐘。 你從 節(jié)點(diǎn) 0 出發(fā),請你返回最少需要多少秒,可以收集到所有蘋果,并回到節(jié)點(diǎn) 0 。
無向樹的邊由 edges 給出,其中 edges[i] = [fromi, toi] ,表示有一條邊連接 from 和 toi 。 除此以外,還有一個(gè)布爾數(shù)組 hasApple ,其中 hasApple[i] = true 代表節(jié)點(diǎn) i 有一個(gè)蘋果,否則,節(jié)點(diǎn) 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
解釋:上圖展示了給定的樹,其中紅色節(jié)點(diǎn)表示有蘋果。
一個(gè)能收集到所有蘋果的最優(yōu)方案由綠色箭頭表示。
示例 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
解釋:上圖展示了給定的樹,其中紅色節(jié)點(diǎn)表示有蘋果。
一個(gè)能收集到所有蘋果的最優(yōu)方案由綠色箭頭表示。示例
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
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/minimum-time-to-collect-all-apples-in-a-tree 著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
由題目條件可知向上走的路徑只有1個(gè)分支,把反向的路徑存在哈希map里 遍歷hasApple數(shù)組,對有蘋果的序號(hào),進(jìn)行dfs往上找,找到一條邊,就在哈希表里刪除一條 最后返回邊的個(gè)數(shù)乘以2
class Solution {
public : int minTime ( int n
, vector
< vector
< int >> & edges
, vector
< bool > & hasApple
) { unordered_map
< int , int > up
; for ( vector
< int > & e
: edges
) up
[ e
[ 1 ] ] = e
[ 0 ] ; int s
= 0 ; for ( int i
= 0 ; i
< hasApple
. size ( ) ; ++ i
) { if ( hasApple
[ i
] ) dfs ( i
, up
, s
) ; } return 2 * s
; } void dfs ( int i
, unordered_map
< int , int > & up
, int & s
) { if ( up
. count ( i
) ) { s
++ ; int to
= up
[ i
] ; up
. erase ( i
) ; dfs ( to
, up
, s
) ; } }
} ;
360 ms 56.3 MB
總結(jié)
以上是生活随笔 為你收集整理的LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS) 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。